mm_mysql 2.1.1 → 2.2.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/README.md +202 -35
- package/db.js +253 -198
- package/index.js +403 -158
- package/package.json +2 -2
- package/sql.js +190 -349
- package/test.js +218 -128
package/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# mm_mysql
|
|
2
|
-
|
|
2
|
+
一个简洁、高效的Node.js MySQL操作库,支持async/await语法,提供直观的API和强大的功能扩展。
|
|
3
3
|
|
|
4
4
|
[](https://www.npmjs.com/package/mm_mysql)
|
|
5
5
|
[](https://gitee.com/qiuwenwu91/mm_mysql/issues)
|
|
@@ -37,6 +37,16 @@ const db = mysql.db().new('users', 'id');
|
|
|
37
37
|
await mysql.close();
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
+
## 主要特性
|
|
41
|
+
|
|
42
|
+
- 支持async/await语法,避免回调地狱
|
|
43
|
+
- 提供简洁直观的API接口
|
|
44
|
+
- 内置事务支持
|
|
45
|
+
- 自动类型推断的表创建功能(支持int、float、varchar、text、datetime、date、time、boolean等多种数据类型)
|
|
46
|
+
- 灵活的查询条件支持
|
|
47
|
+
- 支持连接池管理
|
|
48
|
+
- 调试模式支持
|
|
49
|
+
|
|
40
50
|
## API文档
|
|
41
51
|
|
|
42
52
|
### Mysql类
|
|
@@ -54,26 +64,22 @@ new Mysql(config)
|
|
|
54
64
|
|
|
55
65
|
```javascript
|
|
56
66
|
const config = {
|
|
57
|
-
host: "127.0.0.1",
|
|
58
|
-
port: 3306,
|
|
59
|
-
user: "root",
|
|
60
|
-
password: "password",
|
|
61
|
-
database: "dbname",
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
+
host: "127.0.0.1", // 服务器地址
|
|
68
|
+
port: 3306, // 端口号
|
|
69
|
+
user: "root", // 连接用户名
|
|
70
|
+
password: "password", // 连接密码
|
|
71
|
+
database: "dbname", // 数据库名
|
|
72
|
+
charset: "utf8mb4", // 字符集
|
|
73
|
+
timezone: "+08:00", // 时区
|
|
74
|
+
connect_timeout: 20000, // 连接超时时间(毫秒)
|
|
75
|
+
connection_limit: 10, // 连接池大小
|
|
76
|
+
acquire_timeout: 20000, // 获取连接超时时间(毫秒)
|
|
77
|
+
wait_for_connections: true // 是否等待连接
|
|
67
78
|
};
|
|
68
79
|
```
|
|
69
80
|
|
|
70
81
|
#### 主要方法
|
|
71
82
|
|
|
72
|
-
##### setConfig(config)
|
|
73
|
-
设置数据库配置参数
|
|
74
|
-
- `config` {Object} 配置对象
|
|
75
|
-
- 返回:{Mysql} 实例本身
|
|
76
|
-
|
|
77
83
|
##### open()
|
|
78
84
|
打开数据库连接
|
|
79
85
|
- 返回:{Promise<boolean>} 连接结果
|
|
@@ -82,25 +88,23 @@ const config = {
|
|
|
82
88
|
关闭数据库连接
|
|
83
89
|
- 返回:{Promise<boolean>} 关闭结果
|
|
84
90
|
|
|
85
|
-
##### run(sql, params
|
|
91
|
+
##### run(sql, params)
|
|
86
92
|
执行查询SQL语句
|
|
87
93
|
- `sql` {String} SQL语句
|
|
88
94
|
- `params` {Array} 参数数组(可选)
|
|
89
|
-
- `timeout` {Number} 超时时间(毫秒,可选)
|
|
90
95
|
- 返回:{Promise<Array>} 查询结果数组
|
|
91
96
|
|
|
92
|
-
##### exec(sql, params
|
|
97
|
+
##### exec(sql, params)
|
|
93
98
|
执行非查询SQL语句(增删改)
|
|
94
99
|
- `sql` {String} SQL语句
|
|
95
100
|
- `params` {Array} 参数数组(可选)
|
|
96
|
-
-
|
|
97
|
-
- 返回:{Promise<Object>} 执行结果对象,包含affectedRows和insertId等信息
|
|
101
|
+
- 返回:{Promise<Object>} 执行结果对象,包含insertId、affectedRows和changedRows等信息
|
|
98
102
|
|
|
99
|
-
##### read(table,
|
|
103
|
+
##### read(table, condition, options)
|
|
100
104
|
读取表数据
|
|
101
105
|
- `table` {String} 表名
|
|
102
|
-
- `
|
|
103
|
-
- `options` {Object}
|
|
106
|
+
- `condition` {Object} 查询条件(可选)
|
|
107
|
+
- `options` {Object} 选项配置(可选)
|
|
104
108
|
- 返回:{Promise<Array>} 查询结果
|
|
105
109
|
|
|
106
110
|
##### db()
|
|
@@ -109,15 +113,46 @@ const config = {
|
|
|
109
113
|
|
|
110
114
|
##### beginTransaction()
|
|
111
115
|
开始事务
|
|
112
|
-
- 返回:{Promise<Object>}
|
|
116
|
+
- 返回:{Promise<Object>} 事务连接对象,包含connection、commit、rollback方法
|
|
113
117
|
|
|
114
118
|
##### transaction(callback)
|
|
115
119
|
执行事务
|
|
116
120
|
- `callback` {Function} 事务回调函数,接收事务连接作为参数
|
|
117
121
|
- 返回:{Promise<any>} 回调函数的返回结果
|
|
118
122
|
|
|
123
|
+
##### getConn()
|
|
124
|
+
获取数据库连接(内部使用)
|
|
125
|
+
- 返回:{Promise<Object>} 数据库连接对象
|
|
126
|
+
|
|
127
|
+
##### getPoolStats()
|
|
128
|
+
获取连接池状态信息
|
|
129
|
+
- 返回:{Object} 连接池状态对象
|
|
130
|
+
|
|
131
|
+
##### healthCheck()
|
|
132
|
+
健康检查
|
|
133
|
+
- 返回:{Promise<Object>} 健康检查结果
|
|
134
|
+
|
|
135
|
+
##### init()
|
|
136
|
+
初始化MySQL服务(兼容性方法)
|
|
137
|
+
- 返回:{Promise<void>}
|
|
138
|
+
|
|
119
139
|
### DB类方法
|
|
120
140
|
|
|
141
|
+
#### createTable(model, options)
|
|
142
|
+
自动创建数据库表,支持多种数据类型推断
|
|
143
|
+
- `model` {Object} 模型对象,包含表名和字段定义
|
|
144
|
+
- `table` {String} 表名
|
|
145
|
+
- `fields` {Object} 字段定义,支持以下数据类型:
|
|
146
|
+
- 数字类型(自动推断为INT/FLOAT)
|
|
147
|
+
- 字符串类型(自动推断为VARCHAR/TEXT/DATE/DATETIME/TIME)
|
|
148
|
+
- 布尔类型(自动推断为TINYINT(1))
|
|
149
|
+
- Date对象(自动推断为DATETIME)
|
|
150
|
+
- 时间戳(自动推断为DATETIME)
|
|
151
|
+
- `options` {Object} 选项配置(可选)
|
|
152
|
+
- `primary_key` {String} 主键字段名(可选)
|
|
153
|
+
- `if_not_exists` {Boolean} 是否仅当表不存在时创建(可选,默认为true)
|
|
154
|
+
- 返回:{Promise<Object>} 执行结果
|
|
155
|
+
|
|
121
156
|
#### new(table, key)
|
|
122
157
|
创建数据库表管理器
|
|
123
158
|
- `table` {String} 表名
|
|
@@ -162,16 +197,115 @@ const config = {
|
|
|
162
197
|
|
|
163
198
|
#### beginTransaction()
|
|
164
199
|
开始事务
|
|
165
|
-
- 返回:{Promise}
|
|
200
|
+
- 返回:{Promise<Object>} 事务连接对象,包含connection、commit、rollback方法和_is_ended状态检查
|
|
166
201
|
|
|
167
|
-
#### transaction(
|
|
168
|
-
|
|
169
|
-
- `
|
|
170
|
-
-
|
|
171
|
-
|
|
202
|
+
#### transaction(callback)
|
|
203
|
+
执行事务
|
|
204
|
+
- `callback` {Function} 事务回调函数,接收事务连接对象作为参数
|
|
205
|
+
- 返回:{Promise<any>} 回调函数的返回结果
|
|
206
|
+
|
|
207
|
+
事务连接对象包含以下方法:
|
|
208
|
+
- `connection` {Object} - 数据库连接对象
|
|
209
|
+
- `commit()` {Function} - 提交事务
|
|
210
|
+
- `rollback()` {Function} - 回滚事务
|
|
211
|
+
- `_is_ended()` {Function} - 检查事务是否已结束
|
|
212
|
+
|
|
213
|
+
### Mysql管理器
|
|
214
|
+
|
|
215
|
+
#### mysqlAdmin(scope, config)
|
|
216
|
+
获取Mysql管理器实例(线程安全版)
|
|
217
|
+
- `scope` {String} 作用域名称(可选,默认为'sys')
|
|
218
|
+
- `config` {Object} 配置参数
|
|
219
|
+
- 返回:{Promise<Mysql>} Mysql实例
|
|
220
|
+
|
|
221
|
+
使用示例:
|
|
222
|
+
```javascript
|
|
223
|
+
const { mysqlAdmin } = require('mm_mysql');
|
|
224
|
+
|
|
225
|
+
async function example() {
|
|
226
|
+
// 获取默认作用域的Mysql实例
|
|
227
|
+
const mysql1 = await mysqlAdmin('default', {
|
|
228
|
+
host: 'localhost',
|
|
229
|
+
user: 'root',
|
|
230
|
+
password: '123456',
|
|
231
|
+
database: 'test'
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
// 获取另一个作用域的Mysql实例
|
|
235
|
+
const mysql2 = await mysqlAdmin('backup', {
|
|
236
|
+
host: 'localhost',
|
|
237
|
+
user: 'root',
|
|
238
|
+
password: '123456',
|
|
239
|
+
database: 'backup_db'
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
await mysql1.open();
|
|
243
|
+
await mysql2.open();
|
|
244
|
+
|
|
245
|
+
// 使用实例...
|
|
246
|
+
|
|
247
|
+
await mysql1.close();
|
|
248
|
+
await mysql2.close();
|
|
249
|
+
}
|
|
250
|
+
```
|
|
172
251
|
|
|
173
252
|
### 使用示例
|
|
174
253
|
|
|
254
|
+
#### 表创建示例
|
|
255
|
+
|
|
256
|
+
```javascript
|
|
257
|
+
const { Mysql } = require('mm_mysql');
|
|
258
|
+
|
|
259
|
+
async function createTableExample() {
|
|
260
|
+
const mysql = new Mysql({
|
|
261
|
+
host: "localhost",
|
|
262
|
+
user: "root",
|
|
263
|
+
password: "123456",
|
|
264
|
+
database: "test"
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
await mysql.open();
|
|
268
|
+
|
|
269
|
+
try {
|
|
270
|
+
// 创建数据库表管理器
|
|
271
|
+
const db = mysql.db();
|
|
272
|
+
|
|
273
|
+
// 定义表模型
|
|
274
|
+
const userModel = {
|
|
275
|
+
table: 'users',
|
|
276
|
+
fields: {
|
|
277
|
+
id: 1, // 整数类型 -> INT
|
|
278
|
+
username: 'test', // 字符串类型 -> VARCHAR(255)
|
|
279
|
+
email: 'test@example.com', // 字符串类型 -> VARCHAR(255)
|
|
280
|
+
age: 25, // 整数类型 -> INT
|
|
281
|
+
salary: 5000.50, // 浮点数类型 -> FLOAT
|
|
282
|
+
active: true, // 布尔类型 -> TINYINT(1)
|
|
283
|
+
birth_date: '2000-01-01', // 日期字符串 -> DATE
|
|
284
|
+
bio: '这是一个很长的个人简介...', // 长字符串 -> TEXT
|
|
285
|
+
created_at: '2023-01-01 12:00:00', // 日期时间字符串 -> DATETIME
|
|
286
|
+
login_time: new Date(), // Date对象 -> DATETIME
|
|
287
|
+
last_active: Date.now() // 时间戳 -> DATETIME
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
// 创建表
|
|
292
|
+
const result = await db.createTable(userModel, {
|
|
293
|
+
primary_key: 'id',
|
|
294
|
+
if_not_exists: true
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
console.log('表创建成功:', result);
|
|
298
|
+
|
|
299
|
+
} catch (error) {
|
|
300
|
+
console.error('创建表失败:', error);
|
|
301
|
+
} finally {
|
|
302
|
+
await mysql.close();
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
createTableExample().catch(console.error);
|
|
307
|
+
```
|
|
308
|
+
|
|
175
309
|
#### 基本查询操作
|
|
176
310
|
|
|
177
311
|
```javascript
|
|
@@ -269,13 +403,13 @@ async function transactionExample() {
|
|
|
269
403
|
|
|
270
404
|
try {
|
|
271
405
|
// 使用transaction方法执行事务
|
|
272
|
-
const result = await mysql.transaction(async (
|
|
406
|
+
const result = await mysql.transaction(async (transaction) => {
|
|
273
407
|
// 在事务中执行多个操作
|
|
274
|
-
const insertResult1 = await
|
|
275
|
-
const insertResult2 = await
|
|
408
|
+
const insertResult1 = await transaction.connection.execute('INSERT INTO users (name, age) VALUES (?, ?)', ['赵六', 35]);
|
|
409
|
+
const insertResult2 = await transaction.connection.execute('INSERT INTO users (name, age) VALUES (?, ?)', ['孙七', 40]);
|
|
276
410
|
|
|
277
411
|
// 如果都成功,返回结果
|
|
278
|
-
return { user1: insertResult1.insertId, user2: insertResult2.insertId };
|
|
412
|
+
return { user1: insertResult1[0].insertId, user2: insertResult2[0].insertId };
|
|
279
413
|
});
|
|
280
414
|
|
|
281
415
|
console.log('Transaction succeeded:', result);
|
|
@@ -302,7 +436,40 @@ transactionExample().catch(console.error);
|
|
|
302
436
|
- `_not`: 不等于
|
|
303
437
|
- `_has`: IN查询
|
|
304
438
|
- `_like`: LIKE查询
|
|
439
|
+
6. createTable方法会根据字段值自动推断数据类型,如需更精确的类型控制,建议直接使用SQL语句
|
|
440
|
+
7. 连接池模式下,建议使用mysqlAdmin方法获取实例以确保线程安全
|
|
441
|
+
8. 支持连接池状态监控和健康检查,可用于系统监控
|
|
442
|
+
9. 基于mysql2/promise模块,支持async/await语法
|
|
443
|
+
|
|
444
|
+
## 更新日志
|
|
445
|
+
|
|
446
|
+
### v2.3.0
|
|
447
|
+
- 基于mysql2/promise模块重构,提供更好的性能和稳定性
|
|
448
|
+
- 改进连接池管理,支持连接池状态监控
|
|
449
|
+
- 优化事务处理机制,提供更安全的事务管理
|
|
450
|
+
- 新增健康检查功能,支持连接状态监控
|
|
451
|
+
- 新增mysqlAdmin管理器,支持线程安全的实例管理
|
|
452
|
+
- 改进错误处理机制,提供更详细的错误信息
|
|
453
|
+
- 优化配置参数,支持更多mysql2原生配置选项
|
|
454
|
+
|
|
455
|
+
### v2.2.0
|
|
456
|
+
- 新增createTable方法,支持多种数据类型自动推断
|
|
457
|
+
- 支持boolean类型自动转换为TINYINT(1)
|
|
458
|
+
- 支持date字符串自动识别为DATE类型
|
|
459
|
+
- 支持Date对象自动识别为DATETIME类型
|
|
460
|
+
- 支持时间戳自动识别为DATETIME类型
|
|
305
461
|
|
|
306
462
|
## 许可证
|
|
307
463
|
|
|
308
464
|
ISC License
|
|
465
|
+
|
|
466
|
+
## 贡献
|
|
467
|
+
|
|
468
|
+
欢迎提交Issue和Pull Request!
|
|
469
|
+
|
|
470
|
+
## 联系方式
|
|
471
|
+
|
|
472
|
+
如有问题或建议,请通过以下方式联系:
|
|
473
|
+
|
|
474
|
+
- 项目地址:https://gitee.com/qiuwenwu91/mm_mysql
|
|
475
|
+
- 邮箱:qiuwenwu91@163.com
|