一个查询中的node-mysql多个语句

L.r*_*.rp 47 mysql node.js

我正在使用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');
});
Run Code Online (Sandbox Code Playgroud)

它抛出此错误:

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
Run Code Online (Sandbox Code Playgroud)

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

如果我在单个查询中写它也会成功.

        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');
                });
            });
        });
    });
Run Code Online (Sandbox Code Playgroud)

感谢帮助!

maj*_*rif 128

我猜你使用的是node-mysql.(但也应该适用于node-mysql2)

文件说:

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

多个语句查询

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

var connection = mysql.createConnection({multipleStatements: true});
Run Code Online (Sandbox Code Playgroud)

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

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}]
});
Run Code Online (Sandbox Code Playgroud)

所以,如果你启用了multipleStatements,你的第一个代码应该可行.

  • 如果您希望它并行运行,您应该考虑使用 Promise.all() 并为每个语句使用单个查询,而不是在一个语句中使用多个查询。 (2认同)

小智 8

使用如下所示的“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;
    }
});
Run Code Online (Sandbox Code Playgroud)