【问题标题】:node-mysql multiple statements in one querynode-mysql 一个查询中的多个语句
【发布时间】:2023-03-16 15:02:02
【问题描述】:

我正在使用nodejs 10.26 + express 3.5 + node-mysql 2.1.1 + MySQL-Server Version: 5.6.16.

我有 4 个 DELETE,只需要 1 个数据库请求,所以我用“;”连接了 DELETE 命令...但它总是失败。

var sql_string = "DELETE FROM user_tables WHERE name = 'Testbase';";
sql_string += "DELETE FROM user_tables_structure WHERE parent_table_name = 'Testbase';";
sql_string += "DELETE FROM user_tables_rules WHERE parent_table_name = 'Testbase';";
sql_string += "DELETE FROM user_tables_columns WHERE parent_table_name = 'Testbase';";

connection.query(sql_string, function(err, rows, fields) {
   if (err) throw err;
   res.send('true');
});

它会抛出这个错误:

Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELETE FROM user_tables_structure WHERE parent_table_name = 'Testbase';DELETE FR' at line 1

但是如果我将这个 SQL 粘贴到 PhpMyAdmin 中它总是成功的......

如果我将它写在单个查询中,它也会成功。

        connection.query("DELETE FROM user_tables WHERE name = 'Testbase'", function(err, rows, fields) {
        if (err) throw err;

        connection.query("DELETE FROM user_tables_structure WHERE parent_table_name = 'Testbase'", function(err, rows, fields) {
            if (err) throw err;


            connection.query("DELETE FROM user_tables_rules WHERE parent_table_name = 'Testbase'", function(err, rows, fields) {
                if (err) throw err;

                connection.query("DELETE FROM user_tables_columns WHERE parent_table_name = 'Testbase'", function(err, rows, fields) {
                    if (err) throw err;

                    res.send('true');
                });
            });
        });
    });

感谢您的帮助!

【问题讨论】:

  • 那是因为每个请求只能有 1 个查询。

标签: mysql node.js


【解决方案1】:

要从 DB(SQL) 中获取数据,以下函数可以正常工作

router.get('/', function messageFunction(req, res){ //res.send('嗨,亲爱的 Rasikh,欢迎来到测试页面。') //=> 一种方式 dbConn.query('SELECT COUNT(name) as counted, name, last_name, phone, email from students', function (err, rows, fields) { // 另一种方式 if (err) 抛出错误

  dbConn.query('SELECT name, author from books',
  function (err, rowsBook, fields) { // another Way
      if (err) throw err
    // console.log('The counted is: ', rows[0].counted);    //=> Display in console
    // res.send('Hi Dear Rasikh, Welcome to Test Page.'+ rows[0].counted)  //=> Display in blank page
    
    res.render('main/index',{data:rows, myData:rowsBook});
  })

}); });

【讨论】:

    【解决方案2】:

    我猜你正在使用node-mysql。 (但也应该适用于node-mysql2

    docs 说:

    出于安全原因,禁用了对多个语句的支持(它 如果值未正确转义,则允许 SQL 注入攻击)。

    多语句查询

    要使用此功能,您必须为您的连接启用它:

    var connection = mysql.createConnection({multipleStatements: true});
    

    启用后,您可以通过用分号; 分隔每个语句来执行包含多个语句的查询。结果将是每个语句的数组。

    示例

    connection.query('SELECT ?; SELECT ?', [1, 2], function(err, results) {
      if (err) throw err;
    
      // `results` is an array with one element for every statement in the query:
      console.log(results[0]); // [{1: 1}]
      console.log(results[1]); // [{2: 2}]
    });
    

    因此,如果您启用了multipleStatements,您的第一个代码应该可以工作。

    【讨论】:

    • 这是否适用于占位符查询,例如 connection.query('SELECT * FROM books` WHERE author = ?', ['David'], function (error, results, fields) { });`跨度>
    • @randomness 是的,该语法是正确的。参考github.com/felixge/node-mysql#performing-queries
    • 如果您希望它并行运行,您应该考虑使用 Promise.all() 并为每个语句使用单个查询,而不是在一个语句中使用多个。
    • 哇,谢谢。我不敢相信这个错误是如此具有误导性
    • @RossHarding 您可以将其作为一个单独的问题提出。但是,是的,你可以这样做。
    猜你喜欢
    • 2021-12-19
    • 2020-12-24
    • 2020-02-13
    • 1970-01-01
    • 2020-05-30
    • 2016-01-04
    相关资源
    最近更新 更多