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 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.0.3
14
- - mm_sqlite: ^1.0.0
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.init();
34
+ // 执行查询SQL
35
+ const users = await sql.run('SELECT * FROM users WHERE status = 1');
36
36
 
37
- // 查询数据
38
- const users = await sql.get({ status: 1 }, 'created_at DESC');
37
+ // 执行更新SQL
38
+ const result = await sql.exec('UPDATE users SET status = 0 WHERE id = 1');
39
39
 
40
- // 销毁连接
41
- await sql.destroy();
40
+ // 关闭连接
41
+ await sql.close();
42
42
  ```
43
43
 
44
44
  ### 2. 切换数据库类型
45
45
 
46
46
  ```javascript
47
47
  // 创建MySQL实例
48
- const mysqlSql = new Sql({
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
- const sqliteSql = mysqlSql.use('sqlite', {
59
- database: 'sqlite.db',
60
- table: 'users'
57
+ sql.setConfig({
58
+ db_type: 'sqlite',
59
+ dir: '/db/',
60
+ database: 'sqlite.db'
61
61
  });
62
62
 
63
63
  // 使用SQLite进行操作
64
- await sqliteSql.init();
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 list = await sql.get({ status: 1 }, 'id DESC');
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
- ```javascript
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.set(
103
- { id: 1 }, // 查询条件
104
- { name: '李四', age: 26 } // 更新字段
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 deleteResult = await sql.del({ id: 1 });
87
+ // 执行带超时的修改
88
+ const timeoutExec = await sql.exec('DELETE FROM users WHERE status = 0', [], 3000);
109
89
 
110
- // 添加或修改(如果存在则修改,不存在则添加)
111
- const addOrSetResult = await sql.addOrSet(
112
- { id: 1 }, // 查询条件
113
- { name: '王五', age: 27 } // 要设置的字段
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
- const addListResult = await sql.addList([
122
- { name: '用户1', status: 1 },
123
- { name: '用户2', status: 1 }
124
- ]);
125
-
126
- // 批量修改
127
- const setListResult = await sql.setList([
128
- { query: { id: 1 }, item: { status: 0 } },
129
- { query: { id: 2 }, item: { status: 0 } }
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 model = await sql.getObj({ id: 1 });
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
- model.name = '新名称'; // 自动执行UPDATE操作
147
- model.age += 1; // 自动执行UPDATE操作,增加年龄
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
- table: 'users', // 表名
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
- database: 'db.sqlite', // SQLite数据库文件路径
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.tpl_query({ name: '张', age: 20 }, sqlTemplate);
217
- // 生成的查询条件: "`name` LIKE \"张%\" && `age` > 20"
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. 使用前必须先调用`init()`方法初始化连接
233
- 2. 使用完成后应调用`destroy()`方法销毁连接,避免资源泄漏
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