mm_sqlite 1.0.5 → 1.0.7
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 +201 -0
- package/README.md +352 -0
- package/config.json +8 -0
- package/db/data/example.db.db +0 -0
- package/db/db/test_all_methods.db.db +0 -0
- package/db/db/test_core_methods.db.db +0 -0
- package/db/mm.db +0 -0
- package/db.js +791 -117
- package/index.js +694 -164
- package/link_model.js +132 -0
- package/package.json +43 -36
- package/sql.js +1080 -127
- package/sql.json +56 -0
- package/sql_builder.js +375 -0
- package/test.js +76 -137
- package/test_all_methods.js +115 -0
package/sql.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "user_account",
|
|
3
|
+
"title": "用户信息",
|
|
4
|
+
"table": "user_account",
|
|
5
|
+
"key": "user_id",
|
|
6
|
+
"orderby_default": "`user_id` desc",
|
|
7
|
+
"field_default": "`user_id`,`state`,`vip`,`gm`,`mc`,`referee_id`,`create_time`,`login_time`,`invite_code`,`phone`,`phone_state`,`username`,`nickname`,`email`,`email_state`,`user_group`,`user_admin`,`login_ip`,`signature`,`avatar`,`friends`,`admin_group`",
|
|
8
|
+
"method": "get",
|
|
9
|
+
"query": {
|
|
10
|
+
"state_min": "`state` >= '{0}'",
|
|
11
|
+
"state_max": "`state` <= '{0}'",
|
|
12
|
+
"vip_min": "`vip` >= '{0}'",
|
|
13
|
+
"vip_max": "`vip` <= '{0}'",
|
|
14
|
+
"gm_min": "`gm` >= '{0}'",
|
|
15
|
+
"gm_max": "`gm` <= '{0}'",
|
|
16
|
+
"mc_min": "`mc` >= '{0}'",
|
|
17
|
+
"mc_max": "`mc` <= '{0}'",
|
|
18
|
+
"create_time_min": "`create_time` >= '{0}'",
|
|
19
|
+
"create_time_max": "`create_time` <= '{0}'",
|
|
20
|
+
"login_time_min": "`login_time` >= '{0}'",
|
|
21
|
+
"login_time_max": "`login_time` <= '{0}'",
|
|
22
|
+
"salt": "`salt` like '%{0}%'",
|
|
23
|
+
"invite_code": "`invite_code` like '%{0}%'",
|
|
24
|
+
"phone": "`phone` like '%{0}%'",
|
|
25
|
+
"username": "`username` like '%{0}%'",
|
|
26
|
+
"nickname": "`nickname` like '%{0}%'",
|
|
27
|
+
"password": "`password` like '%{0}%'",
|
|
28
|
+
"email": "`email` like '%{0}%'",
|
|
29
|
+
"user_group": "`user_group` like '%{0}%'",
|
|
30
|
+
"user_admin": "`user_admin` like '%{0}%'",
|
|
31
|
+
"login_ip": "`login_ip` like '%{0}%'",
|
|
32
|
+
"signature": "`signature` like '%{0}%'",
|
|
33
|
+
"avatar": "`avatar` like '%{0}%'",
|
|
34
|
+
"friends": "`friends` like '%{0}%'",
|
|
35
|
+
"admin_group": "`admin_group` like '%{0}%'"
|
|
36
|
+
},
|
|
37
|
+
"query_default": {
|
|
38
|
+
"user_id": "`user_id` = {user_id}"
|
|
39
|
+
},
|
|
40
|
+
"update": {
|
|
41
|
+
"state_add": "`state` = `state` + '{0}'",
|
|
42
|
+
"vip_add": "`vip` = `vip` + '{0}'",
|
|
43
|
+
"gm_add": "`gm` = `gm` + '{0}'",
|
|
44
|
+
"mc_add": "`mc` = `mc` + '{0}'"
|
|
45
|
+
},
|
|
46
|
+
"filter": {
|
|
47
|
+
"table": "table",
|
|
48
|
+
"page": "page",
|
|
49
|
+
"size": "size",
|
|
50
|
+
"method": "method",
|
|
51
|
+
"orderby": "orderby",
|
|
52
|
+
"field": "field",
|
|
53
|
+
"count_ret": "count_ret",
|
|
54
|
+
"user_id": "user_id"
|
|
55
|
+
}
|
|
56
|
+
}
|
package/sql_builder.js
ADDED
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQL构建器类 - 提供与mm_mysql兼容的链式SQL构建接口
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* SQL构建器类
|
|
7
|
+
*/
|
|
8
|
+
class SqlBuilder {
|
|
9
|
+
/**
|
|
10
|
+
* 构造函数
|
|
11
|
+
* @param {Object} sqlite - Sqlite实例
|
|
12
|
+
*/
|
|
13
|
+
constructor(sqlite) {
|
|
14
|
+
this.sqlite = sqlite;
|
|
15
|
+
this.tableName = '';
|
|
16
|
+
this.fields = '*';
|
|
17
|
+
this.whereConditions = [];
|
|
18
|
+
this.orderByField = '';
|
|
19
|
+
this.orderDirection = 'ASC';
|
|
20
|
+
this.limitValue = null;
|
|
21
|
+
this.offsetValue = null;
|
|
22
|
+
this.groupByField = '';
|
|
23
|
+
this.havingCondition = '';
|
|
24
|
+
this.joinClauses = [];
|
|
25
|
+
this.insertData = null;
|
|
26
|
+
this.updateData = null;
|
|
27
|
+
this.deleteFlag = false;
|
|
28
|
+
this.transaction = null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* 设置表名
|
|
33
|
+
* @param {String} table - 表名
|
|
34
|
+
* @returns {SqlBuilder} 返回自身实例
|
|
35
|
+
*/
|
|
36
|
+
table(table) {
|
|
37
|
+
this.tableName = table;
|
|
38
|
+
return this;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 设置查询字段
|
|
43
|
+
* @param {String|Array} fields - 查询字段
|
|
44
|
+
* @returns {SqlBuilder} 返回自身实例
|
|
45
|
+
*/
|
|
46
|
+
select(fields = '*') {
|
|
47
|
+
this.fields = fields;
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* 设置查询条件
|
|
53
|
+
* @param {String|Object} conditions - 查询条件
|
|
54
|
+
* @param {*} value - 条件值
|
|
55
|
+
* @returns {SqlBuilder} 返回自身实例
|
|
56
|
+
*/
|
|
57
|
+
where(conditions, value = null) {
|
|
58
|
+
if (typeof conditions === 'object') {
|
|
59
|
+
// 对象形式的条件
|
|
60
|
+
for (const key in conditions) {
|
|
61
|
+
this.whereConditions.push(`${key} = ?`);
|
|
62
|
+
}
|
|
63
|
+
} else if (typeof conditions === 'string') {
|
|
64
|
+
// 字符串形式的条件
|
|
65
|
+
if (value !== null) {
|
|
66
|
+
this.whereConditions.push(`${conditions} = ?`);
|
|
67
|
+
} else {
|
|
68
|
+
this.whereConditions.push(conditions);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return this;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* 设置OR查询条件
|
|
76
|
+
* @param {String|Object} conditions - 查询条件
|
|
77
|
+
* @param {*} value - 条件值
|
|
78
|
+
* @returns {SqlBuilder} 返回自身实例
|
|
79
|
+
*/
|
|
80
|
+
orWhere(conditions, value = null) {
|
|
81
|
+
// 简化实现,实际应该支持OR逻辑
|
|
82
|
+
return this.where(conditions, value);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* 设置LIKE查询
|
|
87
|
+
* @param {String} field - 字段名
|
|
88
|
+
* @param {String} value - 查询值
|
|
89
|
+
* @returns {SqlBuilder} 返回自身实例
|
|
90
|
+
*/
|
|
91
|
+
like(field, value) {
|
|
92
|
+
this.whereConditions.push(`${field} LIKE ?`);
|
|
93
|
+
return this;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* 设置IN查询
|
|
98
|
+
* @param {String} field - 字段名
|
|
99
|
+
* @param {Array} values - 值数组
|
|
100
|
+
* @returns {SqlBuilder} 返回自身实例
|
|
101
|
+
*/
|
|
102
|
+
in(field, values) {
|
|
103
|
+
const placeholders = values.map(() => '?').join(',');
|
|
104
|
+
this.whereConditions.push(`${field} IN (${placeholders})`);
|
|
105
|
+
return this;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* 设置排序
|
|
110
|
+
* @param {String} field - 排序字段
|
|
111
|
+
* @param {String} direction - 排序方向
|
|
112
|
+
* @returns {SqlBuilder} 返回自身实例
|
|
113
|
+
*/
|
|
114
|
+
orderBy(field, direction = 'ASC') {
|
|
115
|
+
this.orderByField = field;
|
|
116
|
+
this.orderDirection = direction.toUpperCase();
|
|
117
|
+
return this;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* 设置分组
|
|
122
|
+
* @param {String} field - 分组字段
|
|
123
|
+
* @returns {SqlBuilder} 返回自身实例
|
|
124
|
+
*/
|
|
125
|
+
groupBy(field) {
|
|
126
|
+
this.groupByField = field;
|
|
127
|
+
return this;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* 设置HAVING条件
|
|
132
|
+
* @param {String} condition - HAVING条件
|
|
133
|
+
* @returns {SqlBuilder} 返回自身实例
|
|
134
|
+
*/
|
|
135
|
+
having(condition) {
|
|
136
|
+
this.havingCondition = condition;
|
|
137
|
+
return this;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* 设置限制数量
|
|
142
|
+
* @param {Number} limit - 限制数量
|
|
143
|
+
* @returns {SqlBuilder} 返回自身实例
|
|
144
|
+
*/
|
|
145
|
+
limit(limit) {
|
|
146
|
+
this.limitValue = limit;
|
|
147
|
+
return this;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* 设置偏移量
|
|
152
|
+
* @param {Number} offset - 偏移量
|
|
153
|
+
* @returns {SqlBuilder} 返回自身实例
|
|
154
|
+
*/
|
|
155
|
+
offset(offset) {
|
|
156
|
+
this.offsetValue = offset;
|
|
157
|
+
return this;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* 设置插入数据
|
|
162
|
+
* @param {Object} data - 插入数据
|
|
163
|
+
* @returns {SqlBuilder} 返回自身实例
|
|
164
|
+
*/
|
|
165
|
+
insert(data) {
|
|
166
|
+
this.insertData = data;
|
|
167
|
+
return this;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* 设置更新数据
|
|
172
|
+
* @param {Object} data - 更新数据
|
|
173
|
+
* @returns {SqlBuilder} 返回自身实例
|
|
174
|
+
*/
|
|
175
|
+
update(data) {
|
|
176
|
+
this.updateData = data;
|
|
177
|
+
return this;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* 设置删除操作
|
|
182
|
+
* @returns {SqlBuilder} 返回自身实例
|
|
183
|
+
*/
|
|
184
|
+
delete() {
|
|
185
|
+
this.deleteFlag = true;
|
|
186
|
+
return this;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* 设置JOIN操作
|
|
191
|
+
* @param {String} table - 连接表名
|
|
192
|
+
* @param {String} condition - 连接条件
|
|
193
|
+
* @param {String} type - 连接类型
|
|
194
|
+
* @returns {SqlBuilder} 返回自身实例
|
|
195
|
+
*/
|
|
196
|
+
join(table, condition, type = 'INNER') {
|
|
197
|
+
this.joinClauses.push({
|
|
198
|
+
table,
|
|
199
|
+
condition,
|
|
200
|
+
type: type.toUpperCase()
|
|
201
|
+
});
|
|
202
|
+
return this;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* 设置事务
|
|
207
|
+
* @param {Object} transaction - 事务对象
|
|
208
|
+
* @returns {SqlBuilder} 返回自身实例
|
|
209
|
+
*/
|
|
210
|
+
setTransaction(transaction) {
|
|
211
|
+
this.transaction = transaction;
|
|
212
|
+
return this;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* 构建SELECT SQL语句
|
|
217
|
+
* @returns {String} SQL语句
|
|
218
|
+
*/
|
|
219
|
+
_buildSelectSql() {
|
|
220
|
+
let sql = 'SELECT ';
|
|
221
|
+
|
|
222
|
+
// 处理字段
|
|
223
|
+
if (Array.isArray(this.fields)) {
|
|
224
|
+
sql += this.fields.join(', ');
|
|
225
|
+
} else {
|
|
226
|
+
sql += this.fields;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
sql += ` FROM ${this.tableName}`;
|
|
230
|
+
|
|
231
|
+
// 处理JOIN
|
|
232
|
+
for (const join of this.joinClauses) {
|
|
233
|
+
sql += ` ${join.type} JOIN ${join.table} ON ${join.condition}`;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// 处理WHERE条件
|
|
237
|
+
if (this.whereConditions.length > 0) {
|
|
238
|
+
sql += ' WHERE ' + this.whereConditions.join(' AND ');
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// 处理GROUP BY
|
|
242
|
+
if (this.groupByField) {
|
|
243
|
+
sql += ` GROUP BY ${this.groupByField}`;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// 处理HAVING
|
|
247
|
+
if (this.havingCondition) {
|
|
248
|
+
sql += ` HAVING ${this.havingCondition}`;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// 处理ORDER BY
|
|
252
|
+
if (this.orderByField) {
|
|
253
|
+
sql += ` ORDER BY ${this.orderByField} ${this.orderDirection}`;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// 处理LIMIT和OFFSET
|
|
257
|
+
if (this.limitValue !== null) {
|
|
258
|
+
sql += ` LIMIT ${this.limitValue}`;
|
|
259
|
+
if (this.offsetValue !== null) {
|
|
260
|
+
sql += ` OFFSET ${this.offsetValue}`;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return sql;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* 构建INSERT SQL语句
|
|
269
|
+
* @returns {String} SQL语句
|
|
270
|
+
*/
|
|
271
|
+
_buildInsertSql() {
|
|
272
|
+
if (!this.insertData) {
|
|
273
|
+
throw new Error('No insert data provided');
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
const keys = Object.keys(this.insertData);
|
|
277
|
+
const values = Object.values(this.insertData);
|
|
278
|
+
const placeholders = keys.map(() => '?').join(', ');
|
|
279
|
+
|
|
280
|
+
return `INSERT INTO ${this.tableName} (${keys.join(', ')}) VALUES (${placeholders})`;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* 构建UPDATE SQL语句
|
|
285
|
+
* @returns {String} SQL语句
|
|
286
|
+
*/
|
|
287
|
+
_buildUpdateSql() {
|
|
288
|
+
if (!this.updateData) {
|
|
289
|
+
throw new Error('No update data provided');
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const setClause = Object.keys(this.updateData)
|
|
293
|
+
.map(key => `${key} = ?`)
|
|
294
|
+
.join(', ');
|
|
295
|
+
|
|
296
|
+
let sql = `UPDATE ${this.tableName} SET ${setClause}`;
|
|
297
|
+
|
|
298
|
+
if (this.whereConditions.length > 0) {
|
|
299
|
+
sql += ' WHERE ' + this.whereConditions.join(' AND ');
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
return sql;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/**
|
|
306
|
+
* 构建DELETE SQL语句
|
|
307
|
+
* @returns {String} SQL语句
|
|
308
|
+
*/
|
|
309
|
+
_buildDeleteSql() {
|
|
310
|
+
let sql = `DELETE FROM ${this.tableName}`;
|
|
311
|
+
|
|
312
|
+
if (this.whereConditions.length > 0) {
|
|
313
|
+
sql += ' WHERE ' + this.whereConditions.join(' AND ');
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
return sql;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* 执行查询并返回结果
|
|
321
|
+
* @returns {Promise<Array>} 查询结果
|
|
322
|
+
*/
|
|
323
|
+
async get() {
|
|
324
|
+
const sql = this._buildSelectSql();
|
|
325
|
+
return await this.sqlite.run(sql);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* 获取第一条记录
|
|
330
|
+
* @returns {Promise<Object>} 第一条记录
|
|
331
|
+
*/
|
|
332
|
+
async first() {
|
|
333
|
+
this.limit(1);
|
|
334
|
+
const results = await this.get();
|
|
335
|
+
return results.length > 0 ? results[0] : null;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* 统计记录数量
|
|
340
|
+
* @returns {Promise<Number>} 记录数量
|
|
341
|
+
*/
|
|
342
|
+
async count() {
|
|
343
|
+
const originalFields = this.fields;
|
|
344
|
+
this.fields = 'COUNT(*) as count';
|
|
345
|
+
const results = await this.get();
|
|
346
|
+
this.fields = originalFields;
|
|
347
|
+
return results[0].count;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* 执行插入操作
|
|
352
|
+
* @returns {Promise<Object>} 插入结果
|
|
353
|
+
*/
|
|
354
|
+
async exec() {
|
|
355
|
+
if (this.insertData) {
|
|
356
|
+
const sql = this._buildInsertSql();
|
|
357
|
+
return await this.sqlite.exec(sql, Object.values(this.insertData));
|
|
358
|
+
} else if (this.updateData) {
|
|
359
|
+
const sql = this._buildUpdateSql();
|
|
360
|
+
const params = Object.values(this.updateData);
|
|
361
|
+
return await this.sqlite.exec(sql, params);
|
|
362
|
+
} else if (this.deleteFlag) {
|
|
363
|
+
const sql = this._buildDeleteSql();
|
|
364
|
+
return await this.sqlite.exec(sql);
|
|
365
|
+
} else {
|
|
366
|
+
throw new Error('No operation specified');
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// 导出SqlBuilder类
|
|
372
|
+
module.exports = { SqlBuilder };
|
|
373
|
+
|
|
374
|
+
// 兼容CommonJS和ES6模块导出
|
|
375
|
+
exports.SqlBuilder = SqlBuilder;
|
package/test.js
CHANGED
|
@@ -1,142 +1,81 @@
|
|
|
1
1
|
const Sqlite = require('./index.js').Sqlite;
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
// var sql = new Sqlite();
|
|
7
|
-
// sql.open();
|
|
8
|
-
// var db = sql.db();
|
|
9
|
-
// db.table = "test3";
|
|
10
|
-
|
|
11
|
-
// var bl;
|
|
12
|
-
// bl = await db.addTable('test3', 'uid', 'int');
|
|
13
|
-
// console.log("添加表:" + bl);
|
|
14
|
-
|
|
15
|
-
// // bl = await db.field_del('uid', 'int');
|
|
16
|
-
// // console.log("删除字段:" + bl, db.error);
|
|
17
|
-
// // bl = await db.field_add('uid', 'int', true);
|
|
18
|
-
// // console.log("添加字段:" + bl, db.error);
|
|
19
|
-
// bl = await db.field_add('name', 'str');
|
|
20
|
-
// console.log("添加字段:" + bl, db.error);
|
|
21
|
-
// bl = await db.field_add('password', 'str');
|
|
22
|
-
// console.log("添加字段:" + bl, db.error);
|
|
23
|
-
// bl = await db.field_add('username', 'str');
|
|
24
|
-
// console.log("添加字段:" + bl, db.error);
|
|
25
|
-
|
|
26
|
-
// var addArr = [];
|
|
27
|
-
// for (var i = 1; i <= 9; i++) {
|
|
28
|
-
// var add = {
|
|
29
|
-
// name: "test" + i,
|
|
30
|
-
// username: "t" + i,
|
|
31
|
-
// password: "a" + i
|
|
32
|
-
// };
|
|
33
|
-
// addArr.push(add);
|
|
34
|
-
// }
|
|
35
|
-
// // db.addObj({
|
|
36
|
-
// // name: "test",
|
|
37
|
-
// // username: "t",
|
|
38
|
-
// // password: "a"
|
|
39
|
-
// // });
|
|
40
|
-
// var ret = await db.addList(addArr);
|
|
41
|
-
// console.log("添加:" + JSON.stringify(ret), db.error);
|
|
42
|
-
// if(!ret)
|
|
43
|
-
// {
|
|
44
|
-
// console.log(db.sql);
|
|
45
|
-
// }
|
|
46
|
-
|
|
47
|
-
// var setArr = [];
|
|
48
|
-
// for (var i = 1; i <= addArr.length; i++) {
|
|
49
|
-
// setArr.push({
|
|
50
|
-
// query: {
|
|
51
|
-
// name: "test" + i
|
|
52
|
-
// },
|
|
53
|
-
// item: {
|
|
54
|
-
// username: "username" + i,
|
|
55
|
-
// password: "password" + i
|
|
56
|
-
// }
|
|
57
|
-
// });
|
|
58
|
-
// }
|
|
59
|
-
// ret = await db.setList(setArr);
|
|
60
|
-
// console.log("修改:" + JSON.stringify(ret), db.error);
|
|
61
|
-
|
|
62
|
-
// var delArr = [];
|
|
63
|
-
// for (var i = 1; i <= addArr.length; i++) {
|
|
64
|
-
// if (i % 2 == 0) {
|
|
65
|
-
// delArr.push({
|
|
66
|
-
// query: {
|
|
67
|
-
// username: "username" + i
|
|
68
|
-
// }
|
|
69
|
-
// });
|
|
70
|
-
// }
|
|
71
|
-
// }
|
|
72
|
-
// ret = await db.delList(delArr);
|
|
73
|
-
// console.log("删除:" + JSON.stringify(ret), db.error);
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
// // ret = await db.get({ username: "username1" });
|
|
78
|
-
// // console.log("获取:" + JSON.stringify(ret,true), db.error);
|
|
79
|
-
// }
|
|
80
|
-
|
|
81
|
-
// test();
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* 测试通过对象操作数据库
|
|
85
|
-
*/
|
|
86
|
-
async function testFM() {
|
|
87
|
-
var sql = new Sqlite();
|
|
88
|
-
sql.open();
|
|
89
|
-
var db = sql.db();
|
|
90
|
-
db.table = "test3";
|
|
91
|
-
|
|
92
|
-
db.key = 'uid';
|
|
93
|
-
var obj = await db.getObj({});
|
|
94
|
-
console.log("获取:" + JSON.stringify(obj), db.error);
|
|
95
|
-
|
|
96
|
-
obj.username = "张三";
|
|
97
|
-
obj = await db.getObj({});
|
|
98
|
-
console.log("获取:" + JSON.stringify(obj), db.error);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
testFM();
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* 测试新建数据库和表,如果已存在则只打开,不会再创建
|
|
105
|
-
*/
|
|
106
|
-
async function testNew() {
|
|
3
|
+
// 全面测试函数
|
|
4
|
+
async function runAllTests() {
|
|
5
|
+
$.log.info('开始全面测试mm_sqlite模块...');
|
|
107
6
|
var sql = new Sqlite();
|
|
108
|
-
sql.
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
7
|
+
await sql.open();
|
|
8
|
+
|
|
9
|
+
var test_table = 'test_mm_sqlite';
|
|
10
|
+
|
|
11
|
+
try {
|
|
12
|
+
// 1. 测试表创建
|
|
13
|
+
$.log.info('1. 测试表创建...');
|
|
14
|
+
let create_sql = `CREATE TABLE IF NOT EXISTS ${test_table} (
|
|
15
|
+
uid INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
16
|
+
username VARCHAR(50) NOT NULL,
|
|
17
|
+
age INTEGER DEFAULT 0,
|
|
18
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
19
|
+
)`;
|
|
20
|
+
let create_result = await sql.run(create_sql);
|
|
21
|
+
$.log.info('表创建结果:', create_result);
|
|
22
|
+
|
|
23
|
+
// 2. 测试数据插入
|
|
24
|
+
$.log.info('2. 测试数据插入...');
|
|
25
|
+
let insert_sql = `INSERT INTO ${test_table} (username, age) VALUES (?, ?)`;
|
|
26
|
+
let insert_result = await sql.run(insert_sql, ['test_user_1', 25]);
|
|
27
|
+
$.log.info('插入结果:', insert_result);
|
|
28
|
+
|
|
29
|
+
// 3. 测试查询 - 使用exec方法并安全处理返回结果
|
|
30
|
+
$.log.info('3. 测试查询...');
|
|
31
|
+
let query_sql = `SELECT * FROM ${test_table}`;
|
|
32
|
+
let query_result = await sql.exec(query_sql);
|
|
33
|
+
$.log.info('查询结果类型:', typeof query_result);
|
|
34
|
+
$.log.info('查询结果:', query_result);
|
|
35
|
+
|
|
36
|
+
// 4. 测试更新
|
|
37
|
+
$.log.info('4. 测试更新...');
|
|
38
|
+
let update_sql = `UPDATE ${test_table} SET age = ? WHERE username = ?`;
|
|
39
|
+
let update_result = await sql.run(update_sql, [26, 'test_user_1']);
|
|
40
|
+
$.log.info('更新结果:', update_result);
|
|
41
|
+
|
|
42
|
+
// 5. 测试删除
|
|
43
|
+
$.log.info('5. 测试删除...');
|
|
44
|
+
let delete_sql = `DELETE FROM ${test_table} WHERE username = ?`;
|
|
45
|
+
let delete_result = await sql.run(delete_sql, ['test_user_1']);
|
|
46
|
+
$.log.info('删除结果:', delete_result);
|
|
47
|
+
|
|
48
|
+
// 6. 测试事务
|
|
49
|
+
$.log.info('6. 测试事务...');
|
|
50
|
+
let transaction_result = await sql.transaction(async () => {
|
|
51
|
+
await sql.run(`INSERT INTO ${test_table} (username, age) VALUES (?, ?)`, ['transaction_user', 40]);
|
|
52
|
+
return await sql.run(`DELETE FROM ${test_table} WHERE username = ?`, ['transaction_user']);
|
|
53
|
+
});
|
|
54
|
+
$.log.info('事务结果:', transaction_result);
|
|
55
|
+
|
|
56
|
+
// 7. 测试表列表 - 安全处理exec返回结果
|
|
57
|
+
$.log.info('7. 测试表列表...');
|
|
58
|
+
let tables_sql = `SELECT name FROM sqlite_master WHERE type='table'`;
|
|
59
|
+
let tables_result = await sql.exec(tables_sql);
|
|
60
|
+
$.log.info('表列表类型:', typeof tables_result);
|
|
61
|
+
$.log.info('表列表:', tables_result);
|
|
62
|
+
|
|
63
|
+
// 8. 清理测试表
|
|
64
|
+
$.log.info('8. 清理测试表...');
|
|
65
|
+
let drop_result = await sql.run(`DROP TABLE IF EXISTS ${test_table}`);
|
|
66
|
+
$.log.info('删除表结果:', drop_result);
|
|
67
|
+
|
|
68
|
+
$.log.info('所有测试完成!mm_sqlite模块功能正常。');
|
|
69
|
+
return true;
|
|
70
|
+
} catch (error) {
|
|
71
|
+
$.log.error('测试过程中发生错误:', error);
|
|
72
|
+
return false;
|
|
73
|
+
} finally {
|
|
74
|
+
await sql.close();
|
|
75
|
+
}
|
|
118
76
|
}
|
|
119
|
-
testNew();
|
|
120
77
|
|
|
121
|
-
//
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
// var db = sql.db();
|
|
126
|
-
// db.table = "test9";
|
|
127
|
-
// var bl;
|
|
128
|
-
// bl = await db.addTable('test6', 'uid', 'int');
|
|
129
|
-
// console.log("添加表" + bl, db.error);
|
|
130
|
-
// var arr = await db.tables('t*');
|
|
131
|
-
// console.log("获取表" + JSON.stringify(arr), db.error);
|
|
132
|
-
// var list = await db.fields('test');
|
|
133
|
-
// console.log("获取字段信息" + JSON.stringify(list), db.error);
|
|
134
|
-
//
|
|
135
|
-
// db.table = 'test';
|
|
136
|
-
// bl = await db.field_del('set6');
|
|
137
|
-
// console.log("删除字段" + bl, db.error);
|
|
138
|
-
// bl = await db.field_add('set6', 'str');
|
|
139
|
-
// console.log("添加字段" + bl, db.error);
|
|
140
|
-
// }
|
|
141
|
-
//
|
|
142
|
-
// testTable();
|
|
78
|
+
// 运行测试
|
|
79
|
+
(async function() {
|
|
80
|
+
await runAllTests();
|
|
81
|
+
})();
|