#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` WHEREauthor
= ?’, [‘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});
})
});
});