mm_mysql 2.2.0 → 2.2.2

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 (7) hide show
  1. package/README.md +100 -34
  2. package/db.js +144 -170
  3. package/index.js +393 -156
  4. package/package.json +2 -2
  5. package/sql.js +190 -349
  6. package/test.js +218 -128
  7. package/test_create_table.js +0 -193
@@ -1,193 +0,0 @@
1
- const { Mysql } = require('./index');
2
-
3
- /**
4
- * 测试 createTable 方法功能
5
- */
6
- async function testCreateTable() {
7
- console.log('开始测试 createTable 方法...');
8
-
9
- let mysql = null;
10
- const testDatabase = 'test_mm_mysql';
11
- const testTable = 'test_users';
12
-
13
- try {
14
- // 初始化 MySQL 连接
15
- mysql = new Mysql({
16
- host: '127.0.0.1',
17
- port: 3306,
18
- user: 'root',
19
- password: 'Asd159357',
20
- database: testDatabase,
21
- connectionLimit: 1
22
- });
23
-
24
- // 打开连接
25
- await mysql.open();
26
- console.log('✅ 数据库连接成功');
27
-
28
- // 获取 DB 实例
29
- const db = mysql.db();
30
-
31
- // 定义测试表模型
32
- const userModel = {
33
- fields: {
34
- id: 0, // 主键,会被自动设置为 INT AUTO_INCREMENT PRIMARY KEY
35
- username: 'admin', // 字符串,长度 <= 255,会被设置为 VARCHAR(255)
36
- email: 'test@example.com', // 字符串,会被设置为 VARCHAR(255)
37
- age: 25, // 整数,会被设置为 INT
38
- salary: 5000.50, // 浮点数,会被设置为 FLOAT
39
- active: true, // boolean 类型,会被设置为 INT
40
- birth_date: '1990-01-01', // date 类型,会被设置为 DATE
41
- bio: 'This is a very long bio about the user that exceeds 255 characters in length. ' +
42
- 'This is necessary to test the text type functionality in the createTable method. ' +
43
- 'By making this string longer than 255 characters, we can ensure that the field ' +
44
- 'is created as a TEXT type instead of a VARCHAR(255).', // 字符串,长度 > 255,会被设置为 TEXT
45
- created_at: '2023-10-25 10:30:00', // 日期时间字符串,会被设置为 DATETIME
46
- login_time: new Date(), // Date 对象,会被设置为 DATETIME
47
- last_active: Date.now() // 时间戳,会被设置为 DATETIME
48
- }
49
- };
50
-
51
- // 创建表
52
- console.log('开始创建测试表...');
53
- const createResult = await db.createTable(testTable, userModel, 'id', 15000);
54
-
55
- if (createResult && createResult.affectedRows !== undefined) {
56
- console.log('✅ 测试表创建成功');
57
- console.log(' 影响行数:', createResult.affectedRows);
58
- } else {
59
- console.log('⚠️ 表可能已存在(CREATE TABLE IF NOT EXISTS)');
60
- }
61
-
62
- // 验证表是否存在
63
- console.log('\n验证表结构...');
64
- const tableExistsSql = `SHOW TABLES LIKE '${testTable}'`;
65
- const tables = await mysql.run(tableExistsSql);
66
-
67
- if (tables.length > 0) {
68
- console.log('✅ 测试表确实存在');
69
- } else {
70
- throw new Error('测试表不存在');
71
- }
72
-
73
- // 查看表结构
74
- const describeSql = `DESCRIBE ${testTable}`;
75
- const tableStructure = await mysql.run(describeSql);
76
-
77
- console.log('\n表结构:');
78
- tableStructure.forEach(row => {
79
- console.log(` ${row.Field}: ${row.Type} ${row.Null} ${row.Key} ${row.Default} ${row.Extra}`);
80
- });
81
-
82
- // 验证字段类型是否正确
83
- const fieldTypes = {
84
- id: 'int',
85
- username: 'varchar(255)',
86
- email: 'varchar(255)',
87
- age: 'int',
88
- salary: 'float',
89
- active: 'int', // MySQL 中 boolean 会被转换为 tinyint 或 int
90
- birth_date: 'date',
91
- bio: 'text',
92
- created_at: 'datetime',
93
- login_time: 'datetime', // Date 对象会被设置为 DATETIME
94
- last_active: 'datetime' // 时间戳会被设置为 DATETIME
95
- };
96
-
97
- let allFieldsCorrect = true;
98
- tableStructure.forEach(row => {
99
- const expectedType = fieldTypes[row.Field];
100
- if (expectedType && !row.Type.toLowerCase().includes(expectedType)) {
101
- console.log(`❌ 字段 ${row.Field} 类型不正确,预期: ${expectedType},实际: ${row.Type}`);
102
- allFieldsCorrect = false;
103
- }
104
- });
105
-
106
- if (allFieldsCorrect) {
107
- console.log('✅ 所有字段类型符合预期');
108
- }
109
-
110
- // 测试插入数据
111
- console.log('\n测试插入数据...');
112
- const currentTime = new Date();
113
- const insertSql = `INSERT INTO ${testTable} (username, email, age, salary, active, birth_date, bio, created_at, login_time, last_active) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`;
114
- const insertResult = await mysql.exec(insertSql, ['testuser', 'testuser@example.com', 30, 6000.75, true, '1995-05-15', 'Test user bio', '2023-10-25 11:00:00', currentTime, currentTime]);
115
-
116
- if (insertResult.insertId) {
117
- console.log('✅ 数据插入成功,插入ID:', insertResult.insertId);
118
- } else {
119
- throw new Error('数据插入失败');
120
- }
121
-
122
- // 测试查询数据
123
- console.log('\n测试查询数据...');
124
- const selectSql = `SELECT * FROM ${testTable} WHERE id = ?`;
125
- const user = await mysql.run(selectSql, [insertResult.insertId]);
126
-
127
- if (user && user.length > 0) {
128
- console.log('✅ 数据查询成功');
129
- console.log(' 查询结果:', user[0]);
130
- } else {
131
- throw new Error('数据查询失败');
132
- }
133
-
134
- // 测试使用自定义主键
135
- console.log('\n测试使用自定义主键...');
136
- const customKeyTable = 'test_custom_key';
137
- const customModel = {
138
- fields: {
139
- user_id: 'u001', // 自定义主键,会被设置为 INT AUTO_INCREMENT PRIMARY KEY
140
- name: 'test', // 字符串
141
- value: 100, // 整数
142
- is_active: true, // boolean 类型
143
- join_date: '2023-01-01' // date 类型
144
- }
145
- };
146
-
147
- const customCreateResult = await db.createTable(customKeyTable, customModel, 'user_id', 15000);
148
- if (customCreateResult || customCreateResult === 0) {
149
- console.log('✅ 使用自定义主键创建表成功');
150
-
151
- // 验证自定义主键表结构
152
- const customDescribeSql = `DESCRIBE ${customKeyTable}`;
153
- const customStructure = await mysql.run(customDescribeSql);
154
- const customKeyField = customStructure.find(field => field.Field === 'user_id');
155
-
156
- if (customKeyField && customKeyField.Key === 'PRI') {
157
- console.log('✅ 自定义主键设置正确');
158
- } else {
159
- console.log('⚠️ 自定义主键可能未设置为 PRIMARY KEY');
160
- }
161
- }
162
-
163
- // 清理测试表
164
- console.log('\n清理测试环境...');
165
- await mysql.exec(`DROP TABLE IF EXISTS ${testTable}`);
166
- await mysql.exec(`DROP TABLE IF EXISTS ${customKeyTable}`);
167
- console.log('✅ 测试表已删除');
168
-
169
- console.log('\n🎉 所有测试通过!createTable 方法功能正常');
170
-
171
- } catch (error) {
172
- console.error('❌ 测试失败:', error.message);
173
- console.error('错误详情:', error);
174
- return false;
175
- } finally {
176
- // 关闭连接
177
- if (mysql) {
178
- try {
179
- await mysql.close();
180
- console.log('✅ 数据库连接已关闭');
181
- } catch (closeError) {
182
- console.error('⚠️ 关闭数据库连接失败:', closeError.message);
183
- }
184
- }
185
- }
186
-
187
- return true;
188
- }
189
-
190
- // 运行测试
191
- testCreateTable().then(success => {
192
- process.exit(success ? 0 : 1);
193
- });