nodo-mysql múltiples declaraciones en una consulta

Resuelto L.rp asked hace 10 años • 4 respuestas

Estoy usando nodejs 10.26+ express 3.5+ node-mysql 2.1.1+ MySQL-Server Version: 5.6.16.

Obtuve 4 DELETE y solo quiero 1 solicitud de base de datos, así que conecté los comandos DELETE con un ";"... pero siempre falla.

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');
});

Lanza este error:

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

Pero si pego este SQL en PhpMyAdmin siempre tiene éxito...

Si lo escribo en una sola consulta, también será exitoso.

        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');
                });
            });
        });
    });

¡Gracias por la ayuda!

L.rp avatar Apr 24 '14 17:04 L.rp
Aceptado

Supongo que estás usando node-mysql . ( pero también debería funcionar para node-mysql2 )

Los documentos dicen:

La compatibilidad con declaraciones múltiples está deshabilitada por razones de seguridad (permite ataques de inyección SQL si los valores no se escapan correctamente).

Consultas de declaraciones múltiples

Para utilizar esta función, debe habilitarla para su conexión:

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

Una vez habilitado, puede ejecutar consultas con varias declaraciones separando cada declaración con un punto y coma ;. El resultado será una matriz para cada declaración.

Ejemplo

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}]
});

Entonces, si ha habilitado multipleStatements, su primer código debería funcionar.

majidarif avatar Apr 24 '2014 11:04 majidarif

Usar "multiplestatements: true" como se muestra a continuación funcionó para mí

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;
    }
});
Rahith R R avatar Jan 14 '2022 09:01 Rahith R R