【问题标题】:node-mysql multiple statements in one querynode-mysql 一次查询多条语句
【发布时间】:2020-12-24 18:45:12
【问题描述】:

我正在使用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】:

使用如下所示的“multiplestatements: true”对我有用

var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: '',
    multipleStatements: true
});
connection.connect();
 
var sql = "CREATE TABLE test(id INT DEFAULT 1, name VARCHAR(50));ALTER TABLE test ADD age VARCHAR(10);";
 
connection.query(sql, function(error, results, fields) {
    if (error) {
        throw error;
    }
});

【讨论】:

    【解决方案2】:

    要从 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});
      })
    

    }); });

    【讨论】:

      【解决方案3】:

      我猜你正在使用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 您可以将其作为一个单独的问题提出。但是,是的,你可以这样做。
      猜你喜欢
      • 2020-02-13
      • 2023-03-16
      • 2021-12-19
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多