@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.
- package/LICENSE +21 -0
- package/README.md +93 -0
- package/lib/base/database.d.ts +71 -0
- package/lib/base/database.d.ts.map +1 -0
- package/lib/base/database.js +101 -0
- package/lib/base/database.js.map +1 -0
- package/lib/base/dialect.d.ts +34 -0
- package/lib/base/dialect.d.ts.map +1 -0
- package/lib/base/dialect.js +21 -0
- package/lib/base/dialect.js.map +1 -0
- package/lib/base/index.d.ts +6 -0
- package/lib/base/index.d.ts.map +1 -0
- package/lib/base/index.js +6 -0
- package/lib/base/index.js.map +1 -0
- package/lib/base/model.d.ts +53 -0
- package/lib/base/model.d.ts.map +1 -0
- package/lib/base/model.js +65 -0
- package/lib/base/model.js.map +1 -0
- package/lib/base/query-classes.d.ts +68 -0
- package/lib/base/query-classes.d.ts.map +1 -0
- package/lib/base/query-classes.js +178 -0
- package/lib/base/query-classes.js.map +1 -0
- package/lib/base/thenable.d.ts +15 -0
- package/lib/base/thenable.d.ts.map +1 -0
- package/lib/base/thenable.js +33 -0
- package/lib/base/thenable.js.map +1 -0
- package/lib/dialects/memory.d.ts +52 -0
- package/lib/dialects/memory.d.ts.map +1 -0
- package/lib/dialects/memory.js +772 -0
- package/lib/dialects/memory.js.map +1 -0
- package/lib/dialects/mongodb.d.ts +85 -0
- package/lib/dialects/mongodb.d.ts.map +1 -0
- package/lib/dialects/mongodb.js +461 -0
- package/lib/dialects/mongodb.js.map +1 -0
- package/lib/dialects/mysql.d.ts +33 -0
- package/lib/dialects/mysql.d.ts.map +1 -0
- package/lib/dialects/mysql.js +132 -0
- package/lib/dialects/mysql.js.map +1 -0
- package/lib/dialects/pg.d.ts +33 -0
- package/lib/dialects/pg.d.ts.map +1 -0
- package/lib/dialects/pg.js +132 -0
- package/lib/dialects/pg.js.map +1 -0
- package/lib/dialects/redis.d.ts +87 -0
- package/lib/dialects/redis.d.ts.map +1 -0
- package/lib/dialects/redis.js +500 -0
- package/lib/dialects/redis.js.map +1 -0
- package/lib/dialects/sqlite.d.ts +46 -0
- package/lib/dialects/sqlite.d.ts.map +1 -0
- package/lib/dialects/sqlite.js +201 -0
- package/lib/dialects/sqlite.js.map +1 -0
- package/lib/index.d.ts +18 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +18 -0
- package/lib/index.js.map +1 -0
- package/lib/registry.d.ts +37 -0
- package/lib/registry.d.ts.map +1 -0
- package/lib/registry.js +21 -0
- package/lib/registry.js.map +1 -0
- package/lib/type/document/database.d.ts +60 -0
- package/lib/type/document/database.d.ts.map +1 -0
- package/lib/type/document/database.js +242 -0
- package/lib/type/document/database.js.map +1 -0
- package/lib/type/document/model.d.ts +42 -0
- package/lib/type/document/model.d.ts.map +1 -0
- package/lib/type/document/model.js +65 -0
- package/lib/type/document/model.js.map +1 -0
- package/lib/type/keyvalue/database.d.ts +64 -0
- package/lib/type/keyvalue/database.d.ts.map +1 -0
- package/lib/type/keyvalue/database.js +214 -0
- package/lib/type/keyvalue/database.js.map +1 -0
- package/lib/type/keyvalue/model.d.ts +107 -0
- package/lib/type/keyvalue/model.d.ts.map +1 -0
- package/lib/type/keyvalue/model.js +261 -0
- package/lib/type/keyvalue/model.js.map +1 -0
- package/lib/type/related/database.d.ts +32 -0
- package/lib/type/related/database.d.ts.map +1 -0
- package/lib/type/related/database.js +334 -0
- package/lib/type/related/database.js.map +1 -0
- package/lib/type/related/model.d.ts +43 -0
- package/lib/type/related/model.d.ts.map +1 -0
- package/lib/type/related/model.js +108 -0
- package/lib/type/related/model.js.map +1 -0
- package/lib/types.d.ts +251 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +28 -0
- package/lib/types.js.map +1 -0
- package/package.json +54 -0
- package/src/base/database.ts +128 -0
- package/src/base/dialect.ts +76 -0
- package/src/base/index.ts +5 -0
- package/src/base/model.ts +89 -0
- package/src/base/query-classes.ts +217 -0
- package/src/base/thenable.ts +54 -0
- package/src/dialects/memory.ts +880 -0
- package/src/dialects/mongodb.ts +533 -0
- package/src/dialects/mysql.ts +157 -0
- package/src/dialects/pg.ts +157 -0
- package/src/dialects/redis.ts +598 -0
- package/src/dialects/sqlite.ts +233 -0
- package/src/index.ts +20 -0
- package/src/registry.ts +59 -0
- package/src/type/document/database.ts +283 -0
- package/src/type/document/model.ts +86 -0
- package/src/type/keyvalue/database.ts +261 -0
- package/src/type/keyvalue/model.ts +339 -0
- package/src/type/related/database.ts +392 -0
- package/src/type/related/model.ts +117 -0
- package/src/types.ts +403 -0
- 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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"}
|