mm_sqlite 1.0.8 → 1.1.1
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/db/db/test_db_methods.db.db +0 -0
- package/db/mm.db +0 -0
- package/db.js +36 -35
- package/index.js +2 -8
- package/package.json +2 -2
- package/test_db_methods.js +262 -0
|
Binary file
|
package/db/mm.db
CHANGED
|
Binary file
|
package/db.js
CHANGED
|
@@ -85,7 +85,7 @@ DB.prototype.run = async function(sql, params = [], timeout = 30000) {
|
|
|
85
85
|
try {
|
|
86
86
|
// 使用Promise.race实现超时控制
|
|
87
87
|
return await Promise.race([
|
|
88
|
-
this._mysql.run(sql, params),
|
|
88
|
+
this._mysql.run(sql, params, timeout),
|
|
89
89
|
this._createTimeoutPromise(timeout, `查询执行超时: ${sql.substring(0, 100)}...`)
|
|
90
90
|
]);
|
|
91
91
|
} catch (error) {
|
|
@@ -101,23 +101,25 @@ DB.prototype.run = async function(sql, params = [], timeout = 30000) {
|
|
|
101
101
|
/**
|
|
102
102
|
* 执行SQL命令
|
|
103
103
|
* @param {string} sql SQL语句
|
|
104
|
+
* @param {Array} params 参数数组
|
|
104
105
|
* @param {Number} timeout 超时时间(毫秒)
|
|
105
106
|
* @returns {Promise<Object>} 执行结果
|
|
106
107
|
*/
|
|
107
|
-
DB.prototype.exec = async function(sql, timeout = 30000) {
|
|
108
|
+
DB.prototype.exec = async function(sql, params = [], timeout = 30000) {
|
|
108
109
|
if (!this._mysql) {
|
|
109
110
|
throw new Error('SQLite实例未初始化');
|
|
110
111
|
}
|
|
111
112
|
try {
|
|
112
113
|
// 使用Promise.race实现超时控制
|
|
113
114
|
return await Promise.race([
|
|
114
|
-
this._mysql.exec(sql),
|
|
115
|
+
this._mysql.exec(sql, params, timeout),
|
|
115
116
|
this._createTimeoutPromise(timeout, `命令执行超时: ${sql.substring(0, 100)}...`)
|
|
116
117
|
]);
|
|
117
118
|
} catch (error) {
|
|
118
119
|
$.log.error(`[DB] [exec] 命令执行失败`, {
|
|
119
120
|
error: error.message,
|
|
120
|
-
sql: sql.substring(0, 200)
|
|
121
|
+
sql: sql.substring(0, 200),
|
|
122
|
+
params: JSON.stringify(params.slice(0, 5))
|
|
121
123
|
});
|
|
122
124
|
throw error;
|
|
123
125
|
}
|
|
@@ -155,7 +157,7 @@ DB.prototype.getConn = async function(timeout = 15000) {
|
|
|
155
157
|
DB.prototype.start = async function(identifier = "point_1", timeout = 15000) {
|
|
156
158
|
this.task = 1;
|
|
157
159
|
try {
|
|
158
|
-
return await this.exec("BEGIN;", timeout);
|
|
160
|
+
return await this.exec("BEGIN;", [], timeout);
|
|
159
161
|
} catch (err) {
|
|
160
162
|
this.task = 0;
|
|
161
163
|
$.log.error(`[DB] [start] 事务开始失败: ${err.message}`);
|
|
@@ -175,7 +177,7 @@ DB.prototype.commit = async function(timeout = 15000) {
|
|
|
175
177
|
}
|
|
176
178
|
this.task = 2;
|
|
177
179
|
try {
|
|
178
|
-
const result = await this.exec("COMMIT;", timeout);
|
|
180
|
+
const result = await this.exec("COMMIT;", [], timeout);
|
|
179
181
|
// 重置事务状态
|
|
180
182
|
this.task = 0;
|
|
181
183
|
this.task_sql = '';
|
|
@@ -184,7 +186,7 @@ DB.prototype.commit = async function(timeout = 15000) {
|
|
|
184
186
|
$.log.error(`[DB] [commit] 事务提交失败: ${err.message}`);
|
|
185
187
|
// 尝试回滚
|
|
186
188
|
try {
|
|
187
|
-
await this.exec("ROLLBACK;", timeout);
|
|
189
|
+
await this.exec("ROLLBACK;", [], timeout);
|
|
188
190
|
} catch (rollbackErr) {
|
|
189
191
|
$.log.error(`[DB] [commit] 事务回滚也失败: ${rollbackErr.message}`);
|
|
190
192
|
}
|
|
@@ -218,8 +220,8 @@ DB.prototype.back = async function(identifier = "point_1", timeout = 15000) {
|
|
|
218
220
|
}
|
|
219
221
|
this.task = 3;
|
|
220
222
|
try {
|
|
221
|
-
await this.exec("ROLLBACK;", timeout);
|
|
222
|
-
const result = await this.exec("COMMIT;", timeout);
|
|
223
|
+
await this.exec("ROLLBACK;", [], timeout);
|
|
224
|
+
const result = await this.exec("COMMIT;", [], timeout);
|
|
223
225
|
// 重置事务状态
|
|
224
226
|
this.task = 0;
|
|
225
227
|
this.task_sql = '';
|
|
@@ -458,13 +460,9 @@ DB.prototype.addTable = async function(table, field, type = 'int', auto = true,
|
|
|
458
460
|
sqlTemplate = "CREATE TABLE IF NOT EXISTS `{0}` (`{1}` {2} PRIMARY KEY)";
|
|
459
461
|
}
|
|
460
462
|
var sql = sqlTemplate.replace('{0}', table).replace(
|
|
461
|
-
'{1}', field).replace('{2}', fieldType);
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
} else {
|
|
465
|
-
sql += ";"
|
|
466
|
-
}
|
|
467
|
-
var bl = await this.exec(sql, timeout);
|
|
463
|
+
'{1}', field).replace('{2}', fieldType) + ";";
|
|
464
|
+
// SQLite不支持表级COMMENT语法,所以忽略commit参数
|
|
465
|
+
var bl = await this.exec(sql, [], timeout);
|
|
468
466
|
// 设置实例的表名属性,以便后续操作使用
|
|
469
467
|
this.table = table;
|
|
470
468
|
return bl && bl.affectedRows !== undefined ? 1 : 0;
|
|
@@ -506,22 +504,25 @@ DB.prototype.addField = async function(field, type, value = '', not_null = true,
|
|
|
506
504
|
return 0;
|
|
507
505
|
}
|
|
508
506
|
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
sql = sql.replace('{
|
|
512
|
-
var
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
if (comment) {
|
|
519
|
-
sql += " COMMENT '" + comment + "'";
|
|
520
|
-
}
|
|
521
|
-
sql += ";";
|
|
522
|
-
return await this.exec(sql, timeout);
|
|
507
|
+
// 在SQLite中,使用PRAGMA table_info检查表中是否已存在字段
|
|
508
|
+
var sql = "PRAGMA table_info(`{0}`)";
|
|
509
|
+
sql = sql.replace('{0}', this.table);
|
|
510
|
+
var columns = await this.run(sql, [], timeout);
|
|
511
|
+
var fieldExists = false;
|
|
512
|
+
for (var i = 0; i < columns.length; i++) {
|
|
513
|
+
if (columns[i].name === field) {
|
|
514
|
+
fieldExists = true;
|
|
515
|
+
break;
|
|
523
516
|
}
|
|
524
517
|
}
|
|
518
|
+
|
|
519
|
+
if (!fieldExists) {
|
|
520
|
+
var fieldType = this.setType(field, type, value, not_null, auto);
|
|
521
|
+
var sql = "ALTER Table `{0}` ADD `{1}` {2}";
|
|
522
|
+
sql = sql.replace('{0}', this.table).replace('{1}', field).replace('{2}', fieldType) + ";";
|
|
523
|
+
// SQLite不支持字段级COMMENT语法,所以忽略comment参数
|
|
524
|
+
return await this.exec(sql, [], timeout);
|
|
525
|
+
}
|
|
525
526
|
return 0;
|
|
526
527
|
} catch (err) {
|
|
527
528
|
$.log.error(`[DB] [addField] 添加字段失败: ${err.message}`);
|
|
@@ -606,9 +607,9 @@ DB.prototype.delField = async function(table, field, timeout = 15000) {
|
|
|
606
607
|
return 0;
|
|
607
608
|
}
|
|
608
609
|
|
|
609
|
-
var sql = "ALTER TABLE
|
|
610
|
+
var sql = "ALTER TABLE {0} DROP COLUMN {1};";
|
|
610
611
|
sql = sql.replace('{0}', table).replace('{1}', field);
|
|
611
|
-
return await this.exec(sql, timeout);
|
|
612
|
+
return await this.exec(sql, [], timeout);
|
|
612
613
|
} catch (err) {
|
|
613
614
|
$.log.error(`[DB] [delField] 删除字段失败: ${err.message}`);
|
|
614
615
|
return 0;
|
|
@@ -665,9 +666,9 @@ DB.prototype.renameField = async function(table, field, new_field, type, timeout
|
|
|
665
666
|
return 0;
|
|
666
667
|
}
|
|
667
668
|
|
|
668
|
-
var sql = "ALTER TABLE
|
|
669
|
+
var sql = "ALTER TABLE {0} RENAME COLUMN {1} TO {2};";
|
|
669
670
|
sql = sql.replace('{0}', table).replace('{1}', field).replace('{2}', new_field);
|
|
670
|
-
return await this.exec(sql, timeout);
|
|
671
|
+
return await this.exec(sql, [], timeout);
|
|
671
672
|
} catch (err) {
|
|
672
673
|
$.log.error(`[DB] [renameField] 重命名字段失败: ${err.message}`);
|
|
673
674
|
return 0;
|
|
@@ -688,7 +689,7 @@ DB.prototype.editField = function(table, field, type, timeout = 15000) {
|
|
|
688
689
|
$.log.error("[DB] [editField] 参数不完整");
|
|
689
690
|
return 0;
|
|
690
691
|
}
|
|
691
|
-
return this.exec("ALTER TABLE `" + table + "` MODIFY COLUMN `" + field + "` " + type + ";", timeout);
|
|
692
|
+
return this.exec("ALTER TABLE `" + table + "` MODIFY COLUMN `" + field + "` " + type + ";", [], timeout);
|
|
692
693
|
} catch (err) {
|
|
693
694
|
$.log.error(`[DB] [editField] 修改字段类型失败: ${err.message}`);
|
|
694
695
|
return 0;
|
package/index.js
CHANGED
|
@@ -378,14 +378,8 @@ Sqlite.prototype.run = async function(sql, params, timeout) {
|
|
|
378
378
|
if (error) {
|
|
379
379
|
reject(error);
|
|
380
380
|
} else {
|
|
381
|
-
// 保持与MySQL
|
|
382
|
-
|
|
383
|
-
// 否则返回完整结果数组
|
|
384
|
-
if (sql.trim().toUpperCase().startsWith('SELECT') && rows.length === 1) {
|
|
385
|
-
resolve(rows[0]);
|
|
386
|
-
} else {
|
|
387
|
-
resolve(rows);
|
|
388
|
-
}
|
|
381
|
+
// 保持与MySQL兼容的返回值格式,始终返回数组
|
|
382
|
+
resolve(rows);
|
|
389
383
|
}
|
|
390
384
|
});
|
|
391
385
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mm_sqlite",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "高性能SQLite数据库操作模块,提供与mm_mysql完全兼容的API接口,支持异步操作、事务处理和批量操作",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"node": ">=14.0.0"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"mm_logs": "^1.5.
|
|
39
|
+
"mm_logs": "^1.5.4",
|
|
40
40
|
"sqlite3": "^5.1.7",
|
|
41
41
|
"sqlstring": "^2.3.3"
|
|
42
42
|
}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
// 测试db.js中的所有方法
|
|
2
|
+
const { Sqlite } = require('./index');
|
|
3
|
+
const path = require('path');
|
|
4
|
+
|
|
5
|
+
async function testDbMethods() {
|
|
6
|
+
let sql;
|
|
7
|
+
try {
|
|
8
|
+
console.log('=== 开始测试 mm_sqlite/db.js 中的方法 ===\n');
|
|
9
|
+
|
|
10
|
+
// 初始化SQLite实例
|
|
11
|
+
sql = new Sqlite({
|
|
12
|
+
database: './db/test_db_methods.db'
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
await sql.open();
|
|
16
|
+
console.log('✓ 数据库连接成功');
|
|
17
|
+
|
|
18
|
+
// 获取数据库操作实例
|
|
19
|
+
const db = sql.db();
|
|
20
|
+
const test_table = 'test_db_methods';
|
|
21
|
+
const backup_table = 'test_db_methods_backup';
|
|
22
|
+
|
|
23
|
+
// 清理测试环境
|
|
24
|
+
console.log('\n=== 1. 清理测试环境 ===');
|
|
25
|
+
await db.dropTable(test_table);
|
|
26
|
+
await db.dropTable(backup_table);
|
|
27
|
+
console.log('✓ 测试环境清理完成');
|
|
28
|
+
|
|
29
|
+
// 2. 测试表操作方法
|
|
30
|
+
console.log('\n=== 2. 测试表操作方法 ===');
|
|
31
|
+
|
|
32
|
+
// 测试addTable
|
|
33
|
+
console.log('测试addTable()方法...');
|
|
34
|
+
const createResult = await db.addTable(test_table, 'id', 'int', true, '测试表');
|
|
35
|
+
console.log('✓ 表创建结果:', createResult);
|
|
36
|
+
|
|
37
|
+
// 测试hasTable
|
|
38
|
+
console.log('测试hasTable()方法...');
|
|
39
|
+
const hasTableResult = await db.hasTable(test_table);
|
|
40
|
+
console.log('✓ 表是否存在:', hasTableResult);
|
|
41
|
+
|
|
42
|
+
// 测试tables
|
|
43
|
+
console.log('测试tables()方法...');
|
|
44
|
+
const tablesResult = await db.tables();
|
|
45
|
+
console.log('✓ 表列表:', tablesResult);
|
|
46
|
+
|
|
47
|
+
// 3. 测试字段操作方法
|
|
48
|
+
console.log('\n=== 3. 测试字段操作方法 ===');
|
|
49
|
+
|
|
50
|
+
// 设置表名
|
|
51
|
+
db.table = test_table;
|
|
52
|
+
|
|
53
|
+
// 测试addField
|
|
54
|
+
console.log('测试addField()方法...');
|
|
55
|
+
const addFieldResult1 = await db.addField('username', 'varchar', '', true, false, '用户名');
|
|
56
|
+
console.log('✓ 添加username字段结果:', addFieldResult1);
|
|
57
|
+
|
|
58
|
+
// 测试addField(添加email字段)
|
|
59
|
+
console.log('测试addField()方法(添加email字段)...');
|
|
60
|
+
const addFieldResult2 = await db.addField('email', 'varchar', '', true, false, '邮箱');
|
|
61
|
+
console.log('✓ 添加email字段结果:', addFieldResult2);
|
|
62
|
+
|
|
63
|
+
// 测试addField(添加age字段)
|
|
64
|
+
console.log('测试addField()方法(添加age字段)...');
|
|
65
|
+
const addFieldResult3 = await db.addField('age', 'int', 0, true, false, '年龄');
|
|
66
|
+
console.log('✓ 添加age字段结果:', addFieldResult3);
|
|
67
|
+
|
|
68
|
+
// 测试setField
|
|
69
|
+
console.log('测试setField()方法...');
|
|
70
|
+
const setFieldResult = await db.setField('email', 'varchar', '', true, false, '电子邮箱');
|
|
71
|
+
console.log('✓ 修改email字段结果:', setFieldResult);
|
|
72
|
+
|
|
73
|
+
// 测试addField(添加temp字段用于后续delField测试)
|
|
74
|
+
console.log('测试addField()方法(添加temp字段)...');
|
|
75
|
+
await db.addField('temp', 'int', 0, false, false, '临时字段');
|
|
76
|
+
console.log('✓ 添加temp字段结果: 成功');
|
|
77
|
+
|
|
78
|
+
// 测试fields
|
|
79
|
+
console.log('测试fields()方法...');
|
|
80
|
+
const fieldsResult = await db.fields();
|
|
81
|
+
console.log('✓ 字段信息:', fieldsResult.map(f => f.name));
|
|
82
|
+
|
|
83
|
+
// 测试hasField
|
|
84
|
+
console.log('测试hasField()方法...');
|
|
85
|
+
const hasFieldResult = await db.hasField(test_table, 'username');
|
|
86
|
+
console.log('✓ username字段是否存在:', hasFieldResult);
|
|
87
|
+
|
|
88
|
+
// 测试delField
|
|
89
|
+
console.log('测试delField()方法...');
|
|
90
|
+
const delFieldResult = await db.delField(test_table, 'temp');
|
|
91
|
+
console.log('✓ 删除temp字段结果:', delFieldResult);
|
|
92
|
+
|
|
93
|
+
// 测试renameField
|
|
94
|
+
console.log('测试renameField()方法...');
|
|
95
|
+
try {
|
|
96
|
+
// 先检查当前字段
|
|
97
|
+
const fieldsBefore = await db.fields();
|
|
98
|
+
console.log(' - 重命名前字段:', fieldsBefore.map(f => f.name));
|
|
99
|
+
|
|
100
|
+
const renameFieldResult = await db.renameField(test_table, 'age', 'user_age');
|
|
101
|
+
console.log(' - 重命名age字段结果:', renameFieldResult);
|
|
102
|
+
|
|
103
|
+
// 检查重命名后字段
|
|
104
|
+
const fieldsAfter = await db.fields();
|
|
105
|
+
console.log(' - 重命名后字段:', fieldsAfter.map(f => f.name));
|
|
106
|
+
|
|
107
|
+
// 只有当user_age字段存在时,才尝试重命名回age字段
|
|
108
|
+
const hasUserAgeField = fieldsAfter.some(f => f.name === 'user_age');
|
|
109
|
+
if (hasUserAgeField) {
|
|
110
|
+
// 重命名回age字段,保持后续测试一致
|
|
111
|
+
await db.renameField(test_table, 'user_age', 'age');
|
|
112
|
+
console.log(' - 重命名user_age字段回age结果: 成功');
|
|
113
|
+
|
|
114
|
+
// 再次检查字段
|
|
115
|
+
const fieldsFinal = await db.fields();
|
|
116
|
+
console.log(' - 最终字段:', fieldsFinal.map(f => f.name));
|
|
117
|
+
} else {
|
|
118
|
+
console.warn(' - user_age字段不存在,跳过重命名回age字段');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
console.log('✓ renameField方法测试完成');
|
|
122
|
+
} catch (error) {
|
|
123
|
+
console.warn('⚠️ renameField()方法测试失败:', error.message);
|
|
124
|
+
console.log('⚠️ renameField()方法测试跳过');
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// 4. 测试数据操作方法
|
|
128
|
+
console.log('\n=== 4. 测试数据操作方法 ===');
|
|
129
|
+
|
|
130
|
+
// 测试add(插入数据)
|
|
131
|
+
console.log('测试add()方法...');
|
|
132
|
+
const addResult = await db.add({
|
|
133
|
+
username: 'test_user',
|
|
134
|
+
email: 'test@example.com',
|
|
135
|
+
age: 25
|
|
136
|
+
});
|
|
137
|
+
console.log('✓ 插入数据结果:', addResult);
|
|
138
|
+
|
|
139
|
+
// 测试get(查询单条数据)
|
|
140
|
+
console.log('测试get()方法...');
|
|
141
|
+
const getResult = await db.get({ id: 1 });
|
|
142
|
+
console.log('✓ 查询单条数据结果:', getResult[0]);
|
|
143
|
+
|
|
144
|
+
// 测试get(查询多条数据)
|
|
145
|
+
console.log('测试get()方法(查询多条数据)...');
|
|
146
|
+
const listResult = await db.get();
|
|
147
|
+
console.log('✓ 查询多条数据结果:', listResult.length);
|
|
148
|
+
|
|
149
|
+
// 测试set(更新数据)
|
|
150
|
+
console.log('测试set()方法...');
|
|
151
|
+
const setResult = await db.set({ id: 1 }, { age: 26 });
|
|
152
|
+
console.log('✓ 更新数据结果:', setResult);
|
|
153
|
+
|
|
154
|
+
// 测试set(另一种查询条件更新方式)
|
|
155
|
+
console.log('测试set()方法(使用where属性)...');
|
|
156
|
+
db.where = { id: 1 };
|
|
157
|
+
const setResult2 = await db.set(db.where, { age: 27 });
|
|
158
|
+
console.log('✓ set方法(使用where属性)更新结果:', setResult2);
|
|
159
|
+
|
|
160
|
+
// 测试del(删除数据)
|
|
161
|
+
console.log('测试del()方法...');
|
|
162
|
+
const delResult = await db.del({ id: 1 });
|
|
163
|
+
console.log('✓ 删除数据结果:', delResult);
|
|
164
|
+
|
|
165
|
+
// 5. 测试事务操作方法
|
|
166
|
+
console.log('\n=== 5. 测试事务操作方法 ===');
|
|
167
|
+
|
|
168
|
+
// 重新插入一条数据用于事务测试
|
|
169
|
+
await db.add({
|
|
170
|
+
username: 'transaction_test',
|
|
171
|
+
email: 'transaction@example.com',
|
|
172
|
+
age: 30
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
try {
|
|
176
|
+
// 测试start(开始事务)
|
|
177
|
+
console.log(' - 事务开始');
|
|
178
|
+
await db.start();
|
|
179
|
+
|
|
180
|
+
// 在事务中插入数据
|
|
181
|
+
await db.add({
|
|
182
|
+
username: 'transaction_user',
|
|
183
|
+
email: 'user@example.com',
|
|
184
|
+
age: 35
|
|
185
|
+
});
|
|
186
|
+
console.log(' - 事务中插入数据成功');
|
|
187
|
+
|
|
188
|
+
// 测试commit(提交事务)
|
|
189
|
+
await db.commit();
|
|
190
|
+
console.log(' - 事务提交成功');
|
|
191
|
+
|
|
192
|
+
// 验证事务提交结果
|
|
193
|
+
const transactionResult = await db.get();
|
|
194
|
+
console.log(' - 事务后数据总数:', transactionResult.length);
|
|
195
|
+
|
|
196
|
+
} catch (error) {
|
|
197
|
+
// 测试back(回滚事务)
|
|
198
|
+
await db.back();
|
|
199
|
+
console.log(' - 事务回滚');
|
|
200
|
+
throw error;
|
|
201
|
+
} finally {
|
|
202
|
+
// 测试end(结束事务)
|
|
203
|
+
db.end();
|
|
204
|
+
}
|
|
205
|
+
console.log('✓ 事务操作完成');
|
|
206
|
+
|
|
207
|
+
// 6. 测试其他方法
|
|
208
|
+
console.log('\n=== 6. 测试其他方法 ===');
|
|
209
|
+
|
|
210
|
+
// 测试getCreateTable
|
|
211
|
+
console.log('测试getCreateTable()方法...');
|
|
212
|
+
const createTableResult = await db.getCreateTable(test_table);
|
|
213
|
+
console.log('✓ 表创建语句:', createTableResult);
|
|
214
|
+
|
|
215
|
+
// 测试backupTable
|
|
216
|
+
console.log('测试backupTable()方法...');
|
|
217
|
+
const backupResult = await db.backupTable(test_table, backup_table);
|
|
218
|
+
console.log('✓ 表备份结果:', backupResult);
|
|
219
|
+
|
|
220
|
+
// 测试hasTable(备份表)
|
|
221
|
+
console.log('测试hasTable()方法(备份表)...');
|
|
222
|
+
const hasBackupTableResult = await db.hasTable(backup_table);
|
|
223
|
+
console.log('✓ 备份表是否存在:', hasBackupTableResult);
|
|
224
|
+
|
|
225
|
+
// 测试emptyTable
|
|
226
|
+
console.log('测试emptyTable()方法...');
|
|
227
|
+
const emptyResult = await db.emptyTable(test_table);
|
|
228
|
+
console.log('✓ 清空表结果:', emptyResult);
|
|
229
|
+
|
|
230
|
+
// 7. 清理测试环境
|
|
231
|
+
console.log('\n=== 7. 清理测试环境 ===');
|
|
232
|
+
await db.dropTable(test_table);
|
|
233
|
+
await db.dropTable(backup_table);
|
|
234
|
+
console.log('✓ 测试环境清理完成');
|
|
235
|
+
|
|
236
|
+
// 关闭数据库连接
|
|
237
|
+
console.log('\n=== 8. 关闭数据库连接 ===');
|
|
238
|
+
await sql.close();
|
|
239
|
+
console.log('✓ 数据库连接关闭成功');
|
|
240
|
+
|
|
241
|
+
console.log('\n' + '='.repeat(50));
|
|
242
|
+
console.log('所有测试完成!db.js方法测试通过');
|
|
243
|
+
console.log('='.repeat(50));
|
|
244
|
+
|
|
245
|
+
} catch (error) {
|
|
246
|
+
console.error('\n测试失败:', error.message);
|
|
247
|
+
// 关闭数据库连接
|
|
248
|
+
try {
|
|
249
|
+
if (sql) await sql.close();
|
|
250
|
+
} catch (closeError) {
|
|
251
|
+
console.error('关闭数据库连接失败:', closeError.message);
|
|
252
|
+
}
|
|
253
|
+
process.exit(1);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// 运行测试
|
|
258
|
+
testDbMethods();
|
|
259
|
+
|
|
260
|
+
setTimeout(() => {
|
|
261
|
+
process.exit(0);
|
|
262
|
+
}, 5000);
|