Nodejs node-mysql驱动是不是很粗糙?

Nodejs node-mysql驱动是不是很粗糙?

只有最简单的query()。 没有prepare execute 也没有支持事物的提交及回滚

4 回复

当然可以。以下是关于“Nodejs node-mysql驱动是不是很粗糙?”这个问题的回答内容:


标题:Nodejs node-mysql驱动是不是很粗糙?

内容:

Node.js 的 node-mysql 驱动确实存在一些限制,但这些限制并不一定意味着它非常粗糙或不好用。让我们具体分析一下:

  1. 只支持最基本的 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);
        });
      });
      
  2. 缺乏 prepare 和 execute 方法

    • node-mysql 并不直接提供 prepareexecute 方法,这使得处理参数化查询变得稍微复杂一些。但是你可以通过手动拼接 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 注入攻击。
  3. 缺乏事务支持

    • 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 在某些高级特性上有所欠缺,但通过上述方法,你仍然可以完成大部分常见的数据库操作。如果你需要更强大的功能,可以考虑使用其他驱动库,如 mysql2sequelize,它们提供了更多的功能和更好的性能。


我在一个博客里看到了使用事务的方法! 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();
                });
            });
        });
    });
});

解释

  1. 基本查询

    • 使用 pool.query() 执行一个简单的 SQL 查询。这里我们从 users 表中选择所有记录。
  2. 事务处理

    • connection.beginTransaction() 开始一个新的事务。
    • 使用 connection.commit() 提交事务。
    • 如果发生错误,则使用 connection.rollback() 回滚事务。
    • 这种方式虽然繁琐,但提供了足够的灵活性来处理复杂的数据库操作。

总结

尽管 node-mysql 没有内置的预处理语句和事务管理功能,但你可以通过编写额外的代码来实现这些功能。如果你需要更高级的功能,可以考虑使用其他库,如 mysql2,它提供了更多的功能和更好的性能。

回到顶部