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.
Files changed (6) hide show
  1. package/README.md +202 -35
  2. package/db.js +253 -198
  3. package/index.js +403 -158
  4. package/package.json +2 -2
  5. package/sql.js +190 -349
  6. package/test.js +218 -128
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # mm_mysql
2
- 这是超级美眉mysql帮助函数模块,用于便捷操作mysql,使用await方式,可以避免嵌套函数
2
+ 一个简洁、高效的Node.js MySQL操作库,支持async/await语法,提供直观的API和强大的功能扩展。
3
3
 
4
4
  [![npm version](https://badge.fury.io/js/mm_mysql.svg)](https://www.npmjs.com/package/mm_mysql)
5
5
  [![GitHub issues](https://img.shields.io/github/issues/qiuwenwu91/mm_mysql.svg)](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
- multipleStatements: false, // 是否支持多个sql语句同时操作
63
- debug: false, // 是否打印调试日志
64
- charset: "utf8mb4", // 字符集
65
- timezone: "+08:00", // 时区
66
- connectionLimit: 10 // 连接池大小
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, timeout)
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, timeout)
97
+ ##### exec(sql, params)
93
98
  执行非查询SQL语句(增删改)
94
99
  - `sql` {String} SQL语句
95
100
  - `params` {Array} 参数数组(可选)
96
- - `timeout` {Number} 超时时间(毫秒,可选)
97
- - 返回:{Promise<Object>} 执行结果对象,包含affectedRows和insertId等信息
101
+ - 返回:{Promise<Object>} 执行结果对象,包含insertId、affectedRows和changedRows等信息
98
102
 
99
- ##### read(table, where, options)
103
+ ##### read(table, condition, options)
100
104
  读取表数据
101
105
  - `table` {String} 表名
102
- - `where` {Object} 查询条件
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(sql, params)
168
- 在事务中执行SQL
169
- - `sql` {String|Array} SQL语句或语句数组
170
- - `params` {Array} 参数数组
171
- - 返回:{Promise} 执行结果
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 (conn) => {
406
+ const result = await mysql.transaction(async (transaction) => {
273
407
  // 在事务中执行多个操作
274
- const insertResult1 = await conn.exec('INSERT INTO users (name, age) VALUES (?, ?)', ['赵六', 35]);
275
- const insertResult2 = await conn.exec('INSERT INTO users (name, age) VALUES (?, ?)', ['孙七', 40]);
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