Nodejs node-mysql驱动是不是很粗糙?
Nodejs node-mysql驱动是不是很粗糙?
只有最简单的query()。 没有prepare execute 也没有支持事物的提交及回滚
当然可以。以下是关于“Nodejs node-mysql驱动是不是很粗糙?”这个问题的回答内容:
标题:Nodejs node-mysql驱动是不是很粗糙?
内容:
Node.js 的 node-mysql
驱动确实存在一些限制,但这些限制并不一定意味着它非常粗糙或不好用。让我们具体分析一下:
-
只支持最基本的 query() 方法
node-mysql
主要提供了query()
方法来执行 SQL 查询。这是一个非常基础的功能,适用于大部分简单的数据库操作。- 示例代码:
const mysql = require('mysql'); const connection = mysql.createConnection({ host: 'localhost', user: 'root', password: 'password', database: 'testdb' }); connection.connect((err) => { if (err) throw err; console.log('Connected!'); // 使用 query() 方法执行 SQL 查询 connection.query('SELECT * FROM users', (error, results, fields) => { if (error) throw error; console.log('The result is:', results); }); });
-
缺乏 prepare 和 execute 方法
node-mysql
并不直接提供prepare
和execute
方法,这使得处理参数化查询变得稍微复杂一些。但是你可以通过手动拼接 SQL 字符串的方式来实现类似的效果。- 示例代码:
const userId = 1; const sql = 'SELECT * FROM users WHERE id = ?'; connection.query(sql, [userId], (error, results, fields) => { if (error) throw error; console.log('The result is:', results); });
- 这种方式虽然不是标准的预编译语句,但它仍然可以防止 SQL 注入攻击。
-
缺乏事务支持
node-mysql
没有直接提供事务管理功能,但你可以通过手动调用 SQL 语句来实现事务控制。- 示例代码:
connection.beginTransaction(function(err) { if (err) { throw err; } connection.query('INSERT INTO users SET ?', {name: 'John'}, function (error, results, fields) { if (error) { return connection.rollback(function() { throw error; }); } connection.query('UPDATE accounts SET money = money - 100 WHERE id = 1', function (error2, results2, fields2) { if (error2) { return connection.rollback(function() { throw error2; }); } connection.commit(function(err) { if (err) { return connection.rollback(function() { throw err; }); } console.log('Transaction completed!'); }); }); }); });
尽管 node-mysql
在某些高级特性上有所欠缺,但通过上述方法,你仍然可以完成大部分常见的数据库操作。如果你需要更强大的功能,可以考虑使用其他驱动库,如 mysql2
或 sequelize
,它们提供了更多的功能和更好的性能。
我在一个博客里看到了使用事务的方法! http://memo.yomukaku.net/entries/gtJJzZF 不过这样,着实令人狠蛋疼!
node-mysql 确实不太好用,我发现了这个项目比较符合我的需要。我在这个项目基础上进行改造:
(1)改用基于 Q 的 Promise, 避免使用 Callback。
(2)添加了连接池。
改造后的源代码请参见这里,单元测试程序请参见这里。。下面是一些使用例子:
-
SELECT
db.where("name","N1").get('test1').then (rows) -> ...
-
INSERT
db.insert('test1',{name:'N1中文',code:10}).then -> ...
-
UPDATE
db.update('test1',{name:'N1中文'}).then -> ...
-
DELETE
db.delete('test1').then -> ...
-
TRANSACTION
db.transaction() db.where('code',10).delete('test1') db.where('code',20).delete('test1') db.commit().then -> ...
-
QUERY
db.query('DELETE FROM test1 WHERE code = ?',[10]).then -> ...
对于 node-mysql
驱动来说,它确实有一些限制,但并不意味着它是粗糙的。实际上,node-mysql
是一个功能齐全的库,但它并没有包含一些高级特性,如预处理语句(prepare/execute)和事务管理。
示例代码
最基本的查询
const mysql = require('mysql');
// 创建一个连接池
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'password',
database: 'testdb'
});
// 使用连接池执行一个简单的查询
pool.query('SELECT * FROM users', (err, results) => {
if (err) throw err;
console.log(results);
});
事务处理
虽然 node-mysql
没有内置的事务支持,但你可以手动管理事务:
pool.getConnection((err, connection) => {
if (err) throw err;
// 开始事务
connection.beginTransaction(function(err) {
if (err) {
return connection.rollback(function() {
throw err;
});
}
connection.query('INSERT INTO users SET ?', {name: 'John Doe'}, function(err, result) {
if (err) {
return connection.rollback(function() {
throw err;
});
}
connection.query('UPDATE users SET name = "Jane Doe" WHERE id = ?', [result.insertId], function(err) {
if (err) {
return connection.rollback(function() {
throw err;
});
}
connection.commit(function(err) {
if (err) {
return connection.rollback(function() {
throw err;
});
}
console.log("Transaction completed.");
connection.release();
});
});
});
});
});
解释
-
基本查询:
- 使用
pool.query()
执行一个简单的 SQL 查询。这里我们从users
表中选择所有记录。
- 使用
-
事务处理:
connection.beginTransaction()
开始一个新的事务。- 使用
connection.commit()
提交事务。 - 如果发生错误,则使用
connection.rollback()
回滚事务。 - 这种方式虽然繁琐,但提供了足够的灵活性来处理复杂的数据库操作。
总结
尽管 node-mysql
没有内置的预处理语句和事务管理功能,但你可以通过编写额外的代码来实现这些功能。如果你需要更高级的功能,可以考虑使用其他库,如 mysql2
,它提供了更多的功能和更好的性能。