@zhin.js/database 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/lib/base/database.d.ts +71 -0
  4. package/lib/base/database.d.ts.map +1 -0
  5. package/lib/base/database.js +101 -0
  6. package/lib/base/database.js.map +1 -0
  7. package/lib/base/dialect.d.ts +34 -0
  8. package/lib/base/dialect.d.ts.map +1 -0
  9. package/lib/base/dialect.js +21 -0
  10. package/lib/base/dialect.js.map +1 -0
  11. package/lib/base/index.d.ts +6 -0
  12. package/lib/base/index.d.ts.map +1 -0
  13. package/lib/base/index.js +6 -0
  14. package/lib/base/index.js.map +1 -0
  15. package/lib/base/model.d.ts +53 -0
  16. package/lib/base/model.d.ts.map +1 -0
  17. package/lib/base/model.js +65 -0
  18. package/lib/base/model.js.map +1 -0
  19. package/lib/base/query-classes.d.ts +68 -0
  20. package/lib/base/query-classes.d.ts.map +1 -0
  21. package/lib/base/query-classes.js +178 -0
  22. package/lib/base/query-classes.js.map +1 -0
  23. package/lib/base/thenable.d.ts +15 -0
  24. package/lib/base/thenable.d.ts.map +1 -0
  25. package/lib/base/thenable.js +33 -0
  26. package/lib/base/thenable.js.map +1 -0
  27. package/lib/dialects/memory.d.ts +52 -0
  28. package/lib/dialects/memory.d.ts.map +1 -0
  29. package/lib/dialects/memory.js +772 -0
  30. package/lib/dialects/memory.js.map +1 -0
  31. package/lib/dialects/mongodb.d.ts +85 -0
  32. package/lib/dialects/mongodb.d.ts.map +1 -0
  33. package/lib/dialects/mongodb.js +461 -0
  34. package/lib/dialects/mongodb.js.map +1 -0
  35. package/lib/dialects/mysql.d.ts +33 -0
  36. package/lib/dialects/mysql.d.ts.map +1 -0
  37. package/lib/dialects/mysql.js +132 -0
  38. package/lib/dialects/mysql.js.map +1 -0
  39. package/lib/dialects/pg.d.ts +33 -0
  40. package/lib/dialects/pg.d.ts.map +1 -0
  41. package/lib/dialects/pg.js +132 -0
  42. package/lib/dialects/pg.js.map +1 -0
  43. package/lib/dialects/redis.d.ts +87 -0
  44. package/lib/dialects/redis.d.ts.map +1 -0
  45. package/lib/dialects/redis.js +500 -0
  46. package/lib/dialects/redis.js.map +1 -0
  47. package/lib/dialects/sqlite.d.ts +46 -0
  48. package/lib/dialects/sqlite.d.ts.map +1 -0
  49. package/lib/dialects/sqlite.js +201 -0
  50. package/lib/dialects/sqlite.js.map +1 -0
  51. package/lib/index.d.ts +18 -0
  52. package/lib/index.d.ts.map +1 -0
  53. package/lib/index.js +18 -0
  54. package/lib/index.js.map +1 -0
  55. package/lib/registry.d.ts +37 -0
  56. package/lib/registry.d.ts.map +1 -0
  57. package/lib/registry.js +21 -0
  58. package/lib/registry.js.map +1 -0
  59. package/lib/type/document/database.d.ts +60 -0
  60. package/lib/type/document/database.d.ts.map +1 -0
  61. package/lib/type/document/database.js +242 -0
  62. package/lib/type/document/database.js.map +1 -0
  63. package/lib/type/document/model.d.ts +42 -0
  64. package/lib/type/document/model.d.ts.map +1 -0
  65. package/lib/type/document/model.js +65 -0
  66. package/lib/type/document/model.js.map +1 -0
  67. package/lib/type/keyvalue/database.d.ts +64 -0
  68. package/lib/type/keyvalue/database.d.ts.map +1 -0
  69. package/lib/type/keyvalue/database.js +214 -0
  70. package/lib/type/keyvalue/database.js.map +1 -0
  71. package/lib/type/keyvalue/model.d.ts +107 -0
  72. package/lib/type/keyvalue/model.d.ts.map +1 -0
  73. package/lib/type/keyvalue/model.js +261 -0
  74. package/lib/type/keyvalue/model.js.map +1 -0
  75. package/lib/type/related/database.d.ts +32 -0
  76. package/lib/type/related/database.d.ts.map +1 -0
  77. package/lib/type/related/database.js +334 -0
  78. package/lib/type/related/database.js.map +1 -0
  79. package/lib/type/related/model.d.ts +43 -0
  80. package/lib/type/related/model.d.ts.map +1 -0
  81. package/lib/type/related/model.js +108 -0
  82. package/lib/type/related/model.js.map +1 -0
  83. package/lib/types.d.ts +251 -0
  84. package/lib/types.d.ts.map +1 -0
  85. package/lib/types.js +28 -0
  86. package/lib/types.js.map +1 -0
  87. package/package.json +54 -0
  88. package/src/base/database.ts +128 -0
  89. package/src/base/dialect.ts +76 -0
  90. package/src/base/index.ts +5 -0
  91. package/src/base/model.ts +89 -0
  92. package/src/base/query-classes.ts +217 -0
  93. package/src/base/thenable.ts +54 -0
  94. package/src/dialects/memory.ts +880 -0
  95. package/src/dialects/mongodb.ts +533 -0
  96. package/src/dialects/mysql.ts +157 -0
  97. package/src/dialects/pg.ts +157 -0
  98. package/src/dialects/redis.ts +598 -0
  99. package/src/dialects/sqlite.ts +233 -0
  100. package/src/index.ts +20 -0
  101. package/src/registry.ts +59 -0
  102. package/src/type/document/database.ts +283 -0
  103. package/src/type/document/model.ts +86 -0
  104. package/src/type/keyvalue/database.ts +261 -0
  105. package/src/type/keyvalue/model.ts +339 -0
  106. package/src/type/related/database.ts +392 -0
  107. package/src/type/related/model.ts +117 -0
  108. package/src/types.ts +403 -0
  109. package/tsconfig.json +24 -0
@@ -0,0 +1,261 @@
1
+ import { Model } from '../../base';
2
+ /**
3
+ * 键值模型类
4
+ * 继承自 Model,提供键值数据库特有的操作
5
+ */
6
+ export class KeyValueModel extends Model {
7
+ constructor(database, name) {
8
+ super(database, name);
9
+ }
10
+ /**
11
+ * 设置键值对
12
+ */
13
+ async set(key, value, ttl) {
14
+ await this.dialect.query({
15
+ operation: 'set',
16
+ bucket: this.name,
17
+ key,
18
+ value,
19
+ ttl,
20
+ });
21
+ }
22
+ /**
23
+ * 获取值
24
+ */
25
+ async get(key) {
26
+ const results = await this.dialect.query({
27
+ operation: 'get',
28
+ bucket: this.name,
29
+ key,
30
+ }, [key]);
31
+ if (results.length === 0) {
32
+ return null;
33
+ }
34
+ const row = results[0];
35
+ // 检查是否过期
36
+ if (row.expires_at && Date.now() > row.expires_at) {
37
+ await this.deleteByKey(key);
38
+ return null;
39
+ }
40
+ return JSON.parse(row.value);
41
+ }
42
+ /**
43
+ * 删除键
44
+ */
45
+ async deleteByKey(key) {
46
+ const result = await this.dialect.query({
47
+ operation: 'delete',
48
+ bucket: this.name,
49
+ key,
50
+ }, [key]);
51
+ return result.affectedRows > 0;
52
+ }
53
+ /**
54
+ * 检查键是否存在
55
+ */
56
+ async has(key) {
57
+ const results = await this.dialect.query({
58
+ operation: 'has',
59
+ bucket: this.name,
60
+ key,
61
+ }, [key, Date.now()]);
62
+ return results.length > 0;
63
+ }
64
+ /**
65
+ * 获取所有键
66
+ */
67
+ async keys() {
68
+ const results = await this.dialect.query({
69
+ operation: 'keys',
70
+ bucket: this.name,
71
+ }, [Date.now()]);
72
+ return results.map((row) => row.key);
73
+ }
74
+ /**
75
+ * 获取所有值
76
+ */
77
+ async values() {
78
+ const results = await this.dialect.query({
79
+ operation: 'values',
80
+ bucket: this.name,
81
+ }, [Date.now()]);
82
+ return results.map((row) => JSON.parse(row.value));
83
+ }
84
+ /**
85
+ * 获取所有键值对
86
+ */
87
+ async entries() {
88
+ const results = await this.dialect.query({
89
+ operation: 'entries',
90
+ bucket: this.name,
91
+ }, [Date.now()]);
92
+ return results.map((row) => [row.key, JSON.parse(row.value)]);
93
+ }
94
+ /**
95
+ * 清空桶
96
+ */
97
+ async clear() {
98
+ await this.dialect.query({
99
+ operation: 'clear',
100
+ bucket: this.name,
101
+ });
102
+ }
103
+ /**
104
+ * 获取桶大小
105
+ */
106
+ async size() {
107
+ const results = await this.dialect.query({
108
+ operation: 'size',
109
+ bucket: this.name,
110
+ }, [Date.now()]);
111
+ return results[0]?.count || 0;
112
+ }
113
+ /**
114
+ * 批量设置
115
+ */
116
+ async setMany(entries, ttl) {
117
+ const expiresAt = ttl ? Date.now() + ttl * 1000 : null;
118
+ for (const [key, value] of entries) {
119
+ await this.dialect.query({
120
+ operation: 'set',
121
+ bucket: this.name,
122
+ key,
123
+ value,
124
+ ttl,
125
+ }, [key, JSON.stringify(value), expiresAt]);
126
+ }
127
+ }
128
+ /**
129
+ * 设置过期时间
130
+ */
131
+ async expire(key, ttl) {
132
+ const expiresAt = Date.now() + ttl * 1000;
133
+ const result = await this.dialect.query({
134
+ operation: 'expire',
135
+ bucket: this.name,
136
+ key,
137
+ ttl,
138
+ }, [expiresAt, key]);
139
+ return result.affectedRows > 0;
140
+ }
141
+ /**
142
+ * 获取剩余过期时间(秒)
143
+ */
144
+ async ttl(key) {
145
+ const results = await this.dialect.query({
146
+ operation: 'ttl',
147
+ bucket: this.name,
148
+ key,
149
+ }, [key]);
150
+ if (results.length === 0) {
151
+ return null;
152
+ }
153
+ const expiresAt = results[0].expires_at;
154
+ if (!expiresAt) {
155
+ return -1; // 永不过期
156
+ }
157
+ const remaining = Math.ceil((expiresAt - Date.now()) / 1000);
158
+ return remaining > 0 ? remaining : 0;
159
+ }
160
+ /**
161
+ * 移除过期时间
162
+ */
163
+ async persist(key) {
164
+ const result = await this.dialect.query({
165
+ operation: 'persist',
166
+ bucket: this.name,
167
+ key,
168
+ }, [key]);
169
+ return result.affectedRows > 0;
170
+ }
171
+ /**
172
+ * 清理过期键
173
+ */
174
+ async cleanup() {
175
+ const result = await this.dialect.query({
176
+ operation: 'cleanup',
177
+ bucket: this.name,
178
+ }, [Date.now()]);
179
+ return result.affectedRows;
180
+ }
181
+ /**
182
+ * 获取键的模式匹配
183
+ */
184
+ async keysByPattern(pattern) {
185
+ // 简单的通配符匹配,将 * 转换为 SQL 的 %
186
+ const sqlPattern = pattern.replace(/\*/g, '%');
187
+ const results = await this.dialect.query({
188
+ operation: 'keysByPattern',
189
+ bucket: this.name,
190
+ pattern: sqlPattern,
191
+ }, [sqlPattern, Date.now()]);
192
+ return results.map((row) => row.key);
193
+ }
194
+ /**
195
+ * 原子操作:如果不存在则设置
196
+ */
197
+ async setIfNotExists(key, value, ttl) {
198
+ const exists = await this.has(key);
199
+ if (exists) {
200
+ return false;
201
+ }
202
+ await this.set(key, value, ttl);
203
+ return true;
204
+ }
205
+ /**
206
+ * 原子操作:如果存在则设置
207
+ */
208
+ async setIfExists(key, value, ttl) {
209
+ const exists = await this.has(key);
210
+ if (!exists) {
211
+ return false;
212
+ }
213
+ await this.set(key, value, ttl);
214
+ return true;
215
+ }
216
+ /**
217
+ * 原子操作:获取并设置
218
+ */
219
+ async getAndSet(key, value, ttl) {
220
+ const oldValue = await this.get(key);
221
+ await this.set(key, value, ttl);
222
+ return oldValue;
223
+ }
224
+ /**
225
+ * 原子操作:删除并获取
226
+ */
227
+ async deleteAndGet(key) {
228
+ const value = await this.get(key);
229
+ if (value !== null) {
230
+ await this.deleteByKey(key);
231
+ }
232
+ return value;
233
+ }
234
+ // 实现 Model 的抽象方法
235
+ /**
236
+ * 创建数据(键值数据库的创建就是设置)
237
+ */
238
+ async create(data) {
239
+ // 键值数据库的创建需要特殊处理
240
+ throw new Error('KeyValue model does not support generic create. Use set() method instead.');
241
+ }
242
+ /**
243
+ * 查找单个数据
244
+ */
245
+ async selectOne(query) {
246
+ return this.get(query.key);
247
+ }
248
+ /**
249
+ * 统计数量
250
+ */
251
+ async count() {
252
+ return this.size();
253
+ }
254
+ /**
255
+ * 检查是否存在
256
+ */
257
+ async exists(query) {
258
+ return this.has(query.key);
259
+ }
260
+ }
261
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/type/keyvalue/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { Database, Dialect } from '../../base';
2
+ import { RelatedModel } from './model.js';
3
+ import { QueryParams, BuildQueryResult, CreateQueryParams, SelectQueryParams, InsertQueryParams, UpdateQueryParams, DeleteQueryParams, AlterQueryParams, DropTableQueryParams, DropIndexQueryParams, Condition, Column, AddSchema, ModifySchema, DropSchema } from '../../types.js';
4
+ /**
5
+ * 关系型数据库类
6
+ * 支持表、行、列的关系型数据模型
7
+ */
8
+ export declare class RelatedDatabase<D = any, S extends Record<string, object> = Record<string, object>> extends Database<D, S, string> {
9
+ constructor(dialect: Dialect<D, string>, schemas?: Database.Schemas<S>);
10
+ protected initialize(): Promise<void>;
11
+ buildQuery<U extends object = any>(params: QueryParams<U>): BuildQueryResult<string>;
12
+ protected buildCreateQuery<T extends object>(params: CreateQueryParams<T>): BuildQueryResult<string>;
13
+ protected buildSelectQuery<T extends object>(params: SelectQueryParams<T>): BuildQueryResult<string>;
14
+ protected buildInsertQuery<T extends object>(params: InsertQueryParams<T>): BuildQueryResult<string>;
15
+ protected buildUpdateQuery<T extends object>(params: UpdateQueryParams<T>): BuildQueryResult<string>;
16
+ protected buildDeleteQuery<T extends object>(params: DeleteQueryParams<T>): BuildQueryResult<string>;
17
+ protected buildAlterQuery<T extends object>(params: AlterQueryParams<T>): BuildQueryResult<string>;
18
+ protected buildDropTableQuery<T extends object>(params: DropTableQueryParams<T>): BuildQueryResult<string>;
19
+ protected buildDropIndexQuery(params: DropIndexQueryParams): BuildQueryResult<string>;
20
+ protected formatColumnDefinition<T = any>(field: string, column: Column<T>): string;
21
+ protected formatAlteration<T = any>(field: string, alteration: AddSchema<T> | ModifySchema<T> | DropSchema): string;
22
+ protected parseCondition<T extends object>(condition: Condition<T>): [string, any[]];
23
+ /**
24
+ * 获取模型
25
+ */
26
+ model<T extends keyof S>(name: T): RelatedModel<S[T], Dialect<D, string>>;
27
+ /**
28
+ * 获取所有模型名称
29
+ */
30
+ getModelNames(): string[];
31
+ }
32
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/type/related/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,334 @@
1
+ import { Database } from '../../base';
2
+ import { RelatedModel } from './model.js';
3
+ import { isCreateQuery, isSelectQuery, isInsertQuery, isUpdateQuery, isDeleteQuery, isAlterQuery, isDropTableQuery, isDropIndexQuery, } from '../../types.js';
4
+ /**
5
+ * 关系型数据库类
6
+ * 支持表、行、列的关系型数据模型
7
+ */
8
+ export class RelatedDatabase extends Database {
9
+ constructor(dialect, schemas) {
10
+ super(dialect, schemas);
11
+ }
12
+ async initialize() {
13
+ // 自动创建表
14
+ for (const [tableName, schema] of Object.entries(this.schemas || {})) {
15
+ await this.create(tableName, schema);
16
+ }
17
+ }
18
+ // SQL generation method
19
+ buildQuery(params) {
20
+ if (isCreateQuery(params)) {
21
+ return this.buildCreateQuery(params);
22
+ }
23
+ else if (isSelectQuery(params)) {
24
+ return this.buildSelectQuery(params);
25
+ }
26
+ else if (isInsertQuery(params)) {
27
+ return this.buildInsertQuery(params);
28
+ }
29
+ else if (isUpdateQuery(params)) {
30
+ return this.buildUpdateQuery(params);
31
+ }
32
+ else if (isDeleteQuery(params)) {
33
+ return this.buildDeleteQuery(params);
34
+ }
35
+ else if (isAlterQuery(params)) {
36
+ return this.buildAlterQuery(params);
37
+ }
38
+ else if (isDropTableQuery(params)) {
39
+ return this.buildDropTableQuery(params);
40
+ }
41
+ else if (isDropIndexQuery(params)) {
42
+ return this.buildDropIndexQuery(params);
43
+ }
44
+ else {
45
+ throw new Error(`Unsupported query type: ${params.type}`);
46
+ }
47
+ }
48
+ // ========================================================================
49
+ // CREATE TABLE Query
50
+ // ========================================================================
51
+ buildCreateQuery(params) {
52
+ const columnDefs = Object.entries(params.schema).map(([field, column]) => this.formatColumnDefinition(field, column));
53
+ const query = this.dialect.formatCreateTable(params.tableName, columnDefs);
54
+ return { query, params: [] };
55
+ }
56
+ // ========================================================================
57
+ // SELECT Query
58
+ // ========================================================================
59
+ buildSelectQuery(params) {
60
+ const fields = params.fields && params.fields.length
61
+ ? params.fields.map(f => this.dialect.quoteIdentifier(String(f))).join(', ')
62
+ : '*';
63
+ let query = `SELECT ${fields} FROM ${this.dialect.quoteIdentifier(params.tableName)}`;
64
+ const queryParams = [];
65
+ // WHERE clause
66
+ if (params.conditions) {
67
+ const [condition, conditionParams] = this.parseCondition(params.conditions);
68
+ if (condition) {
69
+ query += ` WHERE ${condition}`;
70
+ queryParams.push(...conditionParams);
71
+ }
72
+ }
73
+ // GROUP BY clause
74
+ if (params.groupings && params.groupings.length) {
75
+ const groupings = params.groupings.map(f => this.dialect.quoteIdentifier(String(f))).join(', ');
76
+ query += ` GROUP BY ${groupings}`;
77
+ }
78
+ // ORDER BY clause
79
+ if (params.orderings && params.orderings.length) {
80
+ const orderings = params.orderings
81
+ .map(o => `${this.dialect.quoteIdentifier(String(o.field))} ${o.direction}`)
82
+ .join(', ');
83
+ query += ` ORDER BY ${orderings}`;
84
+ }
85
+ // LIMIT and OFFSET
86
+ if (params.limitCount !== undefined && params.offsetCount !== undefined) {
87
+ query += ` ${this.dialect.formatLimitOffset(params.limitCount, params.offsetCount)}`;
88
+ }
89
+ else if (params.limitCount !== undefined) {
90
+ query += ` ${this.dialect.formatLimit(params.limitCount)}`;
91
+ }
92
+ else if (params.offsetCount !== undefined) {
93
+ query += ` ${this.dialect.formatOffset(params.offsetCount)}`;
94
+ }
95
+ return { query, params: queryParams };
96
+ }
97
+ // ========================================================================
98
+ // INSERT Query
99
+ // ========================================================================
100
+ buildInsertQuery(params) {
101
+ const keys = Object.keys(params.data);
102
+ const columns = keys.map(k => this.dialect.quoteIdentifier(k)).join(', ');
103
+ const placeholders = keys.map((_, index) => this.dialect.getParameterPlaceholder(index)).join(', ');
104
+ const query = `INSERT INTO ${this.dialect.quoteIdentifier(params.tableName)} (${columns}) VALUES (${placeholders})`;
105
+ const values = Object.values(params.data).map(v => this.dialect.formatDefaultValue(v));
106
+ return { query, params: values };
107
+ }
108
+ // ========================================================================
109
+ // UPDATE Query
110
+ // ========================================================================
111
+ buildUpdateQuery(params) {
112
+ const updateKeys = Object.keys(params.update);
113
+ const setClause = updateKeys
114
+ .map((k, index) => `${this.dialect.quoteIdentifier(k)} = ${this.dialect.getParameterPlaceholder(index)}`)
115
+ .join(', ');
116
+ let query = `UPDATE ${this.dialect.quoteIdentifier(params.tableName)} SET ${setClause}`;
117
+ const queryParams = [...Object.values(params.update)];
118
+ // WHERE clause
119
+ if (params.conditions) {
120
+ const [condition, conditionParams] = this.parseCondition(params.conditions);
121
+ if (condition) {
122
+ query += ` WHERE ${condition}`;
123
+ queryParams.push(...conditionParams);
124
+ }
125
+ }
126
+ return { query, params: queryParams };
127
+ }
128
+ // ========================================================================
129
+ // DELETE Query
130
+ // ========================================================================
131
+ buildDeleteQuery(params) {
132
+ let query = `DELETE FROM ${this.dialect.quoteIdentifier(params.tableName)}`;
133
+ const queryParams = [];
134
+ // WHERE clause
135
+ if (params.conditions) {
136
+ const [condition, conditionParams] = this.parseCondition(params.conditions);
137
+ if (condition) {
138
+ query += ` WHERE ${condition}`;
139
+ queryParams.push(...conditionParams);
140
+ }
141
+ }
142
+ return { query, params: queryParams };
143
+ }
144
+ // ========================================================================
145
+ // ALTER TABLE Query
146
+ // ========================================================================
147
+ buildAlterQuery(params) {
148
+ const alterations = Object.entries(params.alterations).map(([field, alteration]) => this.formatAlteration(field, alteration));
149
+ const query = this.dialect.formatAlterTable(params.tableName, alterations);
150
+ return { query, params: [] };
151
+ }
152
+ // ========================================================================
153
+ // DROP TABLE Query
154
+ // ========================================================================
155
+ buildDropTableQuery(params) {
156
+ const query = this.dialect.formatDropTable(params.tableName, true);
157
+ return { query, params: [] };
158
+ }
159
+ // ========================================================================
160
+ // DROP INDEX Query
161
+ // ========================================================================
162
+ buildDropIndexQuery(params) {
163
+ const query = this.dialect.formatDropIndex(params.indexName, params.tableName, true);
164
+ return { query, params: [] };
165
+ }
166
+ // ========================================================================
167
+ // Helper Methods
168
+ // ========================================================================
169
+ formatColumnDefinition(field, column) {
170
+ const name = this.dialect.quoteIdentifier(String(field));
171
+ const type = this.dialect.mapColumnType(column.type);
172
+ const length = column.length ? `(${column.length})` : '';
173
+ const nullable = column.nullable === false ? ' NOT NULL' : '';
174
+ const primary = column.primary ? ' PRIMARY KEY' : '';
175
+ const unique = column.unique ? ' UNIQUE' : '';
176
+ const defaultVal = column.default !== undefined
177
+ ? ` DEFAULT ${this.dialect.formatDefaultValue(column.default)}`
178
+ : '';
179
+ return `${name} ${type}${length}${primary}${unique}${nullable}${defaultVal}`;
180
+ }
181
+ formatAlteration(field, alteration) {
182
+ const name = this.dialect.quoteIdentifier(field);
183
+ switch (alteration.action) {
184
+ case 'add':
185
+ // 将 alteration 转换为 Column 格式
186
+ const addColumn = {
187
+ type: alteration.type,
188
+ nullable: alteration.nullable,
189
+ default: alteration.default,
190
+ primary: alteration.primary,
191
+ length: alteration.length
192
+ };
193
+ return `ADD COLUMN ${this.formatColumnDefinition(field, addColumn)}`;
194
+ case 'modify':
195
+ const type = alteration.type ? this.dialect.mapColumnType(alteration.type) : '';
196
+ const length = alteration.length ? `(${alteration.length})` : '';
197
+ const nullable = alteration.nullable !== undefined
198
+ ? (alteration.nullable ? ' NULL' : ' NOT NULL')
199
+ : '';
200
+ const defaultVal = alteration.default !== undefined
201
+ ? ` DEFAULT ${this.dialect.formatDefaultValue(alteration.default)}`
202
+ : '';
203
+ return `MODIFY COLUMN ${name} ${type}${length}${nullable}${defaultVal}`;
204
+ case 'drop':
205
+ return `DROP COLUMN ${name}`;
206
+ default:
207
+ throw new Error(`Unsupported alteration action`);
208
+ }
209
+ }
210
+ parseCondition(condition) {
211
+ const clauses = [];
212
+ const params = [];
213
+ for (const key in condition) {
214
+ if (key === '$and' && Array.isArray(condition.$and)) {
215
+ const subClauses = [];
216
+ for (const subCondition of condition.$and) {
217
+ const [subClause, subParams] = this.parseCondition(subCondition);
218
+ if (subClause) {
219
+ subClauses.push(`(${subClause})`);
220
+ params.push(...subParams);
221
+ }
222
+ }
223
+ if (subClauses.length) {
224
+ clauses.push(subClauses.join(' AND '));
225
+ }
226
+ }
227
+ else if (key === '$or' && Array.isArray(condition.$or)) {
228
+ const subClauses = [];
229
+ for (const subCondition of condition.$or) {
230
+ const [subClause, subParams] = this.parseCondition(subCondition);
231
+ if (subClause) {
232
+ subClauses.push(`(${subClause})`);
233
+ params.push(...subParams);
234
+ }
235
+ }
236
+ if (subClauses.length) {
237
+ clauses.push(subClauses.join(' OR '));
238
+ }
239
+ }
240
+ else if (key === '$not' && condition.$not) {
241
+ const [subClause, subParams] = this.parseCondition(condition.$not);
242
+ if (subClause) {
243
+ clauses.push(`NOT (${subClause})`);
244
+ params.push(...subParams);
245
+ }
246
+ }
247
+ else {
248
+ const value = condition[key];
249
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
250
+ for (const op in value) {
251
+ const quotedKey = this.dialect.quoteIdentifier(key);
252
+ const placeholder = this.dialect.getParameterPlaceholder(params.length);
253
+ switch (op) {
254
+ case '$eq':
255
+ clauses.push(`${quotedKey} = ${placeholder}`);
256
+ params.push(value[op]);
257
+ break;
258
+ case '$ne':
259
+ clauses.push(`${quotedKey} <> ${placeholder}`);
260
+ params.push(value[op]);
261
+ break;
262
+ case '$gt':
263
+ clauses.push(`${quotedKey} > ${placeholder}`);
264
+ params.push(value[op]);
265
+ break;
266
+ case '$gte':
267
+ clauses.push(`${quotedKey} >= ${placeholder}`);
268
+ params.push(value[op]);
269
+ break;
270
+ case '$lt':
271
+ clauses.push(`${quotedKey} < ${placeholder}`);
272
+ params.push(value[op]);
273
+ break;
274
+ case '$lte':
275
+ clauses.push(`${quotedKey} <= ${placeholder}`);
276
+ params.push(value[op]);
277
+ break;
278
+ case '$in':
279
+ if (Array.isArray(value[op]) && value[op].length) {
280
+ const placeholders = value[op].map(() => this.dialect.getParameterPlaceholder(params.length + value[op].indexOf(value[op])));
281
+ clauses.push(`${quotedKey} IN (${placeholders.join(', ')})`);
282
+ params.push(...value[op]);
283
+ }
284
+ else {
285
+ clauses.push('1=0'); // Empty IN clause should yield no results
286
+ }
287
+ break;
288
+ case '$nin':
289
+ if (Array.isArray(value[op]) && value[op].length) {
290
+ const placeholders = value[op].map(() => this.dialect.getParameterPlaceholder(params.length + value[op].indexOf(value[op])));
291
+ clauses.push(`${quotedKey} NOT IN (${placeholders.join(', ')})`);
292
+ params.push(...value[op]);
293
+ }
294
+ break;
295
+ case '$like':
296
+ clauses.push(`${quotedKey} LIKE ${placeholder}`);
297
+ params.push(value[op]);
298
+ break;
299
+ case '$nlike':
300
+ clauses.push(`${quotedKey} NOT LIKE ${placeholder}`);
301
+ params.push(value[op]);
302
+ break;
303
+ }
304
+ }
305
+ }
306
+ else {
307
+ const quotedKey = this.dialect.quoteIdentifier(key);
308
+ const placeholder = this.dialect.getParameterPlaceholder(params.length);
309
+ clauses.push(`${quotedKey} = ${placeholder}`);
310
+ params.push(value);
311
+ }
312
+ }
313
+ }
314
+ return [clauses.join(' AND '), params];
315
+ }
316
+ /**
317
+ * 获取模型
318
+ */
319
+ model(name) {
320
+ let model = this.models.get(name);
321
+ if (!model) {
322
+ model = new RelatedModel(this, name);
323
+ this.models.set(name, model);
324
+ }
325
+ return model;
326
+ }
327
+ /**
328
+ * 获取所有模型名称
329
+ */
330
+ getModelNames() {
331
+ return Object.keys(this.schemas || {});
332
+ }
333
+ }
334
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/type/related/database.ts"],"names":[],"mappings":"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"}