узел-mysql несколько операторов в одном запросе

#javascript #mysql #node.js #mariadb

#mysql #node.js

Вопрос:

Я использую nodejs 10.26 express 3.5 node-mysql 2.1.1 MySQL-Server Version: 5.6.16 .

Я получил 4 удаления и хочу только 1 запрос к базе данных, поэтому я подключил команды УДАЛЕНИЯ с помощью «;»… но это всегда приводит к сбою.

 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. Это потому, что у вас может быть только 1 запрос на запрос.

Ответ №1:

Я предполагаю, что вы используете node-mysql. (но также должно работать для узла-mysql2)

В документах говорится:

Поддержка нескольких операторов отключена по соображениям безопасности (это допускает атаки с использованием 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 , ваш первый код должен сработать.

Комментарии:

1. Будет ли это работать с запросами на заполнение, такими как connection.query('SELECT * FROM books` WHERE author = ?’, [‘David’], функция (ошибка, результаты, поля) { });`

2. @случайность да, этот синтаксис правильный. Обратитесь к github.com/felixge/node-mysql#performing-queries

3. Если вы хотите, чтобы он выполнялся параллельно, вам следует рассмотреть возможность использования Promise.all() и использовать отдельные запросы для каждого оператора вместо нескольких в одном операторе.

4. вау, спасибо за это. я не могу поверить, что ошибка настолько вводит в заблуждение

5. @RossHarding вы можете задать это как отдельный вопрос. но да, вы можете это сделать.

Ответ №2:

Использование «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;
    }
});
  

Ответ №3:

Для извлечения данных из базы данных (SQL) следующая функция будет работать точно

router.get(‘/’, функция messageFunction(req, res){ //res.send(‘Привет, дорогой Расих, добро пожаловать на тестовую страницу.’) //=> Один способ DBConn.query(‘ВЫБЕРИТЕ КОЛИЧЕСТВО (имя) как подсчитанное, имя, фамилию, телефон, электронную почту от студентов’, функция (ошибка, строки, поля) { // другой способ, если (ошибка) выбросить ошибку

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

});
});