mm_sql 1.3.8 → 1.4.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/README.md +192 -123
- package/db/mm.db +0 -0
- package/index.js +156 -97
- package/package.json +3 -3
- package/test.js +27 -70
- package/test2.js +32 -8
- package/localhostmm.db +0 -0
- package//345/205/274/345/256/271/346/200/247/346/212/245/345/221/212.md +0 -202
- package//345/205/274/345/256/271/346/200/247/346/265/213/350/257/225/346/212/245/345/221/212.md +0 -87
- package//351/207/215/346/236/204/345/256/214/346/210/220/346/212/245/345/221/212.md +0 -160
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# mm_sql
|
|
2
2
|
|
|
3
|
-
一个通用的SQL帮助类,支持通过切换db_type实现对不同数据库的操作,包括MySQL和SQLite
|
|
3
|
+
一个通用的SQL帮助类,支持通过切换db_type实现对不同数据库的操作,包括MySQL和SQLite等,提供统一的API接口,支持异步操作和基础SQL执行。
|
|
4
4
|
|
|
5
5
|
## 安装
|
|
6
6
|
|
|
@@ -10,8 +10,8 @@ npm install mm_sql
|
|
|
10
10
|
|
|
11
11
|
## 依赖
|
|
12
12
|
|
|
13
|
-
- mm_mysql: ^2.
|
|
14
|
-
- mm_sqlite: ^1.
|
|
13
|
+
- mm_mysql: ^2.1.1
|
|
14
|
+
- mm_sqlite: ^1.1.3
|
|
15
15
|
|
|
16
16
|
## 使用方法
|
|
17
17
|
|
|
@@ -19,132 +19,126 @@ npm install mm_sql
|
|
|
19
19
|
|
|
20
20
|
```javascript
|
|
21
21
|
// 引入模块
|
|
22
|
-
const Sql = require('mm_sql');
|
|
22
|
+
const { Sql } = require('mm_sql');
|
|
23
23
|
|
|
24
24
|
// 创建实例(默认使用MySQL)
|
|
25
25
|
const sql = new Sql({
|
|
26
|
+
db_type: 'mysql',
|
|
26
27
|
host: 'localhost',
|
|
27
28
|
port: 3306,
|
|
28
29
|
user: 'root',
|
|
29
30
|
password: 'password',
|
|
30
|
-
database: 'test_db'
|
|
31
|
-
table: 'users'
|
|
31
|
+
database: 'test_db'
|
|
32
32
|
});
|
|
33
33
|
|
|
34
|
-
//
|
|
35
|
-
await sql.
|
|
34
|
+
// 执行查询SQL
|
|
35
|
+
const users = await sql.run('SELECT * FROM users WHERE status = 1');
|
|
36
36
|
|
|
37
|
-
//
|
|
38
|
-
const
|
|
37
|
+
// 执行更新SQL
|
|
38
|
+
const result = await sql.exec('UPDATE users SET status = 0 WHERE id = 1');
|
|
39
39
|
|
|
40
|
-
//
|
|
41
|
-
await sql.
|
|
40
|
+
// 关闭连接
|
|
41
|
+
await sql.close();
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
### 2. 切换数据库类型
|
|
45
45
|
|
|
46
46
|
```javascript
|
|
47
47
|
// 创建MySQL实例
|
|
48
|
-
const
|
|
48
|
+
const sql = new Sql({
|
|
49
49
|
db_type: 'mysql',
|
|
50
50
|
host: 'localhost',
|
|
51
51
|
user: 'root',
|
|
52
52
|
password: 'password',
|
|
53
|
-
database: 'mysql_db'
|
|
54
|
-
table: 'users'
|
|
53
|
+
database: 'mysql_db'
|
|
55
54
|
});
|
|
56
55
|
|
|
57
56
|
// 切换到SQLite
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
sql.setConfig({
|
|
58
|
+
db_type: 'sqlite',
|
|
59
|
+
dir: '/db/',
|
|
60
|
+
database: 'sqlite.db'
|
|
61
61
|
});
|
|
62
62
|
|
|
63
63
|
// 使用SQLite进行操作
|
|
64
|
-
await
|
|
65
|
-
const data = await sqliteSql.get({});
|
|
64
|
+
const data = await sql.run('SELECT * FROM users');
|
|
66
65
|
```
|
|
67
66
|
|
|
68
67
|
### 3. 主要方法
|
|
69
68
|
|
|
70
|
-
####
|
|
69
|
+
#### SQL执行方法
|
|
71
70
|
|
|
72
71
|
```javascript
|
|
73
|
-
//
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
// 查询单条数据
|
|
77
|
-
const user = await sql.getObj({ id: 1 });
|
|
78
|
-
|
|
79
|
-
// 分页查询
|
|
80
|
-
const result = await sql.getCount(
|
|
81
|
-
{ status: 1 },
|
|
82
|
-
'created_at DESC',
|
|
83
|
-
'id, name, email'
|
|
84
|
-
);
|
|
85
|
-
// result结构: { list: [...], total: 100, page: 1, size: 20, pages: 5 }
|
|
86
|
-
|
|
87
|
-
// 统计
|
|
88
|
-
const count = await sql.count({ status: 1 });
|
|
89
|
-
```
|
|
72
|
+
// 执行查询操作(返回结果集)
|
|
73
|
+
const users = await sql.run('SELECT * FROM users WHERE status = 1');
|
|
90
74
|
|
|
91
|
-
|
|
75
|
+
// 执行带参数的查询
|
|
76
|
+
const user = await sql.run('SELECT * FROM users WHERE id = ?', [1]);
|
|
92
77
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const addResult = await sql.add({
|
|
96
|
-
name: '张三',
|
|
97
|
-
age: 25,
|
|
98
|
-
status: 1
|
|
99
|
-
});
|
|
78
|
+
// 执行带超时的查询
|
|
79
|
+
const timeoutResult = await sql.run('SELECT * FROM users WHERE status = 1', [], 5000);
|
|
100
80
|
|
|
101
|
-
//
|
|
102
|
-
const updateResult = await sql.
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
);
|
|
81
|
+
// 执行修改操作(返回影响行数)
|
|
82
|
+
const updateResult = await sql.exec('UPDATE users SET status = 0 WHERE id = 1');
|
|
83
|
+
|
|
84
|
+
// 执行带参数的修改
|
|
85
|
+
const updateWithParams = await sql.exec('UPDATE users SET name = ? WHERE id = ?', ['张三', 1]);
|
|
106
86
|
|
|
107
|
-
//
|
|
108
|
-
const
|
|
87
|
+
// 执行带超时的修改
|
|
88
|
+
const timeoutExec = await sql.exec('DELETE FROM users WHERE status = 0', [], 3000);
|
|
109
89
|
|
|
110
|
-
//
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
90
|
+
// 使用对象参数方式调用
|
|
91
|
+
const result = await sql.run({
|
|
92
|
+
sql: 'SELECT * FROM users WHERE name LIKE ?',
|
|
93
|
+
params: ['张%'],
|
|
94
|
+
timeout: 5000
|
|
95
|
+
});
|
|
115
96
|
```
|
|
116
97
|
|
|
117
|
-
####
|
|
98
|
+
#### 连接管理方法
|
|
118
99
|
|
|
119
100
|
```javascript
|
|
120
|
-
//
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
//
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
// 批量删除
|
|
133
|
-
const delListResult = await sql.delList([
|
|
134
|
-
{ query: { id: 1 } },
|
|
135
|
-
{ query: { id: 2 } }
|
|
136
|
-
]);
|
|
101
|
+
// 手动打开数据库连接
|
|
102
|
+
await sql.open();
|
|
103
|
+
|
|
104
|
+
// 手动关闭数据库连接
|
|
105
|
+
await sql.close();
|
|
106
|
+
|
|
107
|
+
// 动态修改配置
|
|
108
|
+
sql.setConfig({
|
|
109
|
+
host: 'new_host',
|
|
110
|
+
database: 'new_database'
|
|
111
|
+
});
|
|
137
112
|
```
|
|
138
113
|
|
|
139
|
-
####
|
|
114
|
+
#### 模板方法
|
|
140
115
|
|
|
141
116
|
```javascript
|
|
142
|
-
//
|
|
143
|
-
const
|
|
117
|
+
// SQL模板查询生成
|
|
118
|
+
const query = sql.tplQuery({ name: '张', age: 20 }, {
|
|
119
|
+
name: '`name` LIKE "{0}%"',
|
|
120
|
+
age: '`age` > {0}'
|
|
121
|
+
});
|
|
122
|
+
// 生成: "`name` LIKE \"张%\" AND `age` > 20"
|
|
123
|
+
|
|
124
|
+
// SQL模板数据生成
|
|
125
|
+
const body = sql.tplBody({ name: '李四', age: 25 }, {
|
|
126
|
+
name: '`name` = {0}',
|
|
127
|
+
age: '`age` = {0}'
|
|
128
|
+
});
|
|
129
|
+
// 生成: "`name` = '李四', `age` = 25"
|
|
130
|
+
|
|
131
|
+
// 参数过滤
|
|
132
|
+
const filteredParams = sql.filter({ id: 1, name: '张三', password: '123' }, ['password']);
|
|
133
|
+
// 结果: { id: 1, name: '张三' }
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
#### 数据库适配器方法
|
|
144
137
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
138
|
+
```javascript
|
|
139
|
+
// 获取底层数据库适配器
|
|
140
|
+
const dbAdapter = sql.db();
|
|
141
|
+
// 可用于直接操作底层数据库接口
|
|
148
142
|
```
|
|
149
143
|
|
|
150
144
|
### 4. 配置选项
|
|
@@ -154,14 +148,8 @@ const sql = new Sql({
|
|
|
154
148
|
// 数据库类型
|
|
155
149
|
db_type: 'mysql', // 可选值: 'mysql', 'sqlite'
|
|
156
150
|
|
|
157
|
-
//
|
|
158
|
-
|
|
159
|
-
key: 'id', // 主键
|
|
160
|
-
|
|
161
|
-
// 分页配置
|
|
162
|
-
page: 1, // 默认页码
|
|
163
|
-
size: 20, // 默认每页数量
|
|
164
|
-
limit: 1000, // 最大查询数量
|
|
151
|
+
// 作用域配置
|
|
152
|
+
scope: 'sys', // 默认作用域
|
|
165
153
|
|
|
166
154
|
// MySQL配置
|
|
167
155
|
host: 'localhost',
|
|
@@ -169,38 +157,13 @@ const sql = new Sql({
|
|
|
169
157
|
user: 'root',
|
|
170
158
|
password: '',
|
|
171
159
|
database: '',
|
|
172
|
-
charset: 'utf8mb4',
|
|
173
160
|
|
|
174
161
|
// SQLite配置
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
// 其他配置
|
|
178
|
-
filter: {}, // 过滤参数
|
|
179
|
-
separator: '|' // 分隔符,用于多条件查询
|
|
162
|
+
dir: '/db/', // SQLite数据库文件存储目录
|
|
163
|
+
database: 'db.sqlite' // SQLite数据库文件名
|
|
180
164
|
});
|
|
181
165
|
```
|
|
182
166
|
|
|
183
|
-
## 事务操作
|
|
184
|
-
|
|
185
|
-
```javascript
|
|
186
|
-
// MySQL事务示例
|
|
187
|
-
const mysqlTransactionResult = await sql.exec(`
|
|
188
|
-
START TRANSACTION;
|
|
189
|
-
INSERT INTO users (name, age) VALUES ('测试用户', 30);
|
|
190
|
-
UPDATE users SET status = 1 WHERE id = LAST_INSERT_ID();
|
|
191
|
-
COMMIT;
|
|
192
|
-
`);
|
|
193
|
-
|
|
194
|
-
// SQLite事务示例
|
|
195
|
-
const sqliteTransactionResult = await sql.exec(`
|
|
196
|
-
BEGIN TRANSACTION;
|
|
197
|
-
INSERT INTO users (name, age) VALUES ('测试用户', 30);
|
|
198
|
-
UPDATE users SET status = 1 WHERE id = last_insert_rowid();
|
|
199
|
-
COMMIT;
|
|
200
|
-
`);
|
|
201
|
-
|
|
202
|
-
// 注意:不同数据库的事务语法和函数可能有所不同,请根据实际使用的数据库类型调整SQL语句
|
|
203
|
-
|
|
204
167
|
## 高级用法
|
|
205
168
|
|
|
206
169
|
### 1. SQL模板
|
|
@@ -213,8 +176,31 @@ const sqlTemplate = {
|
|
|
213
176
|
};
|
|
214
177
|
|
|
215
178
|
// 使用模板构建查询条件
|
|
216
|
-
const query = sql.
|
|
217
|
-
// 生成的查询条件: "`name` LIKE \"张%\"
|
|
179
|
+
const query = sql.tplQuery({ name: '张', age: 20 }, sqlTemplate);
|
|
180
|
+
// 生成的查询条件: "`name` LIKE \"张%\" AND `age` > 20"
|
|
181
|
+
|
|
182
|
+
// 使用模板构建更新语句
|
|
183
|
+
const body = sql.tplBody({ name: '李四', age: 25 }, {
|
|
184
|
+
name: '`name` = {0}',
|
|
185
|
+
age: '`age` = {0}'
|
|
186
|
+
});
|
|
187
|
+
// 生成的更新语句: "`name` = '李四', `age` = 25"
|
|
188
|
+
|
|
189
|
+
// 使用配置文件定义SQL模板
|
|
190
|
+
const config = {
|
|
191
|
+
"query": {
|
|
192
|
+
"name": "`name` like '%{0}%'"
|
|
193
|
+
},
|
|
194
|
+
"where": {
|
|
195
|
+
"uid": "`uid` = {0}"
|
|
196
|
+
},
|
|
197
|
+
"update": {
|
|
198
|
+
"name": "`name` = {0}"
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
// 使用配置文件中的模板
|
|
203
|
+
const queryFromConfig = sql.tplQuery({ name: '张' }, config.query);
|
|
218
204
|
```
|
|
219
205
|
|
|
220
206
|
### 2. 自定义SQL执行
|
|
@@ -225,20 +211,103 @@ const result = await sql.run('SELECT * FROM users WHERE status = 1');
|
|
|
225
211
|
|
|
226
212
|
// 执行自定义更新SQL
|
|
227
213
|
const updateResult = await sql.exec('UPDATE users SET status = 0 WHERE id = 1');
|
|
214
|
+
|
|
215
|
+
// 执行带参数的SQL
|
|
216
|
+
const user = await sql.run('SELECT * FROM users WHERE id = ?', [1]);
|
|
217
|
+
|
|
218
|
+
// 执行带超时的SQL
|
|
219
|
+
const timeoutResult = await sql.run('SELECT * FROM users WHERE status = 1', [], 5000);
|
|
220
|
+
|
|
221
|
+
// 执行事务操作(MySQL)
|
|
222
|
+
const mysqlTransactionResult = await sql.exec(`
|
|
223
|
+
START TRANSACTION;
|
|
224
|
+
INSERT INTO users (name, age) VALUES ('测试用户', 30);
|
|
225
|
+
UPDATE users SET status = 1 WHERE id = LAST_INSERT_ID();
|
|
226
|
+
COMMIT;
|
|
227
|
+
`);
|
|
228
|
+
|
|
229
|
+
// 执行事务操作(SQLite)
|
|
230
|
+
const sqliteTransactionResult = await sql.exec(`
|
|
231
|
+
BEGIN TRANSACTION;
|
|
232
|
+
INSERT INTO users (name, age) VALUES ('测试用户', 30);
|
|
233
|
+
UPDATE users SET status = 1 WHERE id = last_insert_rowid();
|
|
234
|
+
COMMIT;
|
|
235
|
+
`);
|
|
228
236
|
```
|
|
229
237
|
|
|
230
238
|
## 注意事项
|
|
231
239
|
|
|
232
|
-
1.
|
|
233
|
-
2.
|
|
240
|
+
1. 系统会自动初始化连接,无需手动调用初始化方法
|
|
241
|
+
2. 使用完成后建议调用`close()`方法关闭连接,避免资源泄漏
|
|
234
242
|
3. 切换数据库类型时会重新创建适配器,原来的连接会被关闭
|
|
235
|
-
4.
|
|
243
|
+
4. 不同数据库的SQL语法可能有所差异,请根据实际使用的数据库类型调整SQL语句
|
|
244
|
+
5. 事务操作需要根据具体数据库类型使用相应的SQL语法
|
|
245
|
+
6. 错误处理:所有方法都包含错误处理,会记录错误日志并抛出异常
|
|
246
|
+
|
|
247
|
+
## 错误处理
|
|
248
|
+
|
|
249
|
+
```javascript
|
|
250
|
+
try {
|
|
251
|
+
const result = await sql.run('SELECT * FROM non_existent_table');
|
|
252
|
+
} catch (error) {
|
|
253
|
+
console.error('SQL执行失败:', error);
|
|
254
|
+
// 错误信息会被自动记录到日志
|
|
255
|
+
}
|
|
256
|
+
```
|
|
236
257
|
|
|
237
258
|
## 支持的数据库类型
|
|
238
259
|
|
|
239
260
|
- MySQL
|
|
240
261
|
- SQLite
|
|
241
262
|
|
|
263
|
+
## API参考
|
|
264
|
+
|
|
265
|
+
### Sql类
|
|
266
|
+
|
|
267
|
+
#### constructor(config)
|
|
268
|
+
创建Sql实例
|
|
269
|
+
- `config`: 配置对象
|
|
270
|
+
|
|
271
|
+
#### run(sql, params, timeout)
|
|
272
|
+
执行查询SQL
|
|
273
|
+
- `sql`: SQL语句或选项对象
|
|
274
|
+
- `params`: 参数数组(可选)
|
|
275
|
+
- `timeout`: 超时时间(毫秒,可选)
|
|
276
|
+
|
|
277
|
+
#### exec(sql, params, timeout)
|
|
278
|
+
执行修改SQL
|
|
279
|
+
- `sql`: SQL语句或选项对象
|
|
280
|
+
- `params`: 参数数组(可选)
|
|
281
|
+
- `timeout`: 超时时间(毫秒,可选)
|
|
282
|
+
|
|
283
|
+
#### open()
|
|
284
|
+
手动打开数据库连接
|
|
285
|
+
|
|
286
|
+
#### close()
|
|
287
|
+
手动关闭数据库连接
|
|
288
|
+
|
|
289
|
+
#### setConfig(config)
|
|
290
|
+
动态修改配置
|
|
291
|
+
- `config`: 新的配置对象
|
|
292
|
+
|
|
293
|
+
#### tplQuery(paramDt, sqlDt)
|
|
294
|
+
生成SQL查询条件
|
|
295
|
+
- `paramDt`: 参数对象
|
|
296
|
+
- `sqlDt`: SQL模板对象
|
|
297
|
+
|
|
298
|
+
#### tplBody(paramDt, sqlDt)
|
|
299
|
+
生成SQL数据部分
|
|
300
|
+
- `paramDt`: 参数对象
|
|
301
|
+
- `sqlDt`: SQL模板对象
|
|
302
|
+
|
|
303
|
+
#### filter(paramDt, arr)
|
|
304
|
+
过滤参数对象
|
|
305
|
+
- `paramDt`: 参数对象
|
|
306
|
+
- `arr`: 需要过滤的键数组
|
|
307
|
+
|
|
308
|
+
#### db()
|
|
309
|
+
获取底层数据库适配器
|
|
310
|
+
|
|
242
311
|
## 许可证
|
|
243
312
|
|
|
244
|
-
MIT
|
|
313
|
+
MIT
|
package/db/mm.db
CHANGED
|
Binary file
|