#mysql #node.js
Вопрос:
У меня есть приложение узла, которое вставляет некоторые данные в базу данных. Проблема в том, что при выполнении INSERT INTO
запроса данные не добавляются в базу данных. После выполнения INSERT
запроса я запустил SELECT
один для тестирования, и он вернул пустой список. Я также запросил базу данных из DataGrip, и это также показало items
, что таблица полностью пуста.
Это мой код, который, насколько я могу судить, является правильным:
let items = require("../data/items.json");
for (let [categoryName, itemList] of Object.entries(items)) {
if (categoryName !== "all") {
for (let item of itemList) {
let itemInfo = Object.entries(item);
bot.con.query(`INSERT INTO items (id, desc, category) VALUES ('${itemInfo[0][0]}', '${itemInfo[0][1]}', '${categoryName}')`, (err, rows) => {
// do nothing
});
}
}
}
ИЗМЕНИТЬ: MySQL теперь возвращает синтаксическую ошибку, хотя я не уверен, где в моем запросе ошибка.
В этом и заключается ошибка:
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 'desc, category) VALUES ('STOCK_OF_STONKS', 'Stock Of Stonks', 'oddities')' at line 1
at Query.Sequence._packetToError (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)
at Query.ErrorPacket (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/protocol/sequences/Query.js:79:18)
at Protocol._parsePacket (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/protocol/Protocol.js:291:23)
at Parser._parsePacket (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/protocol/Parser.js:433:10)
at Parser.write (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/protocol/Parser.js:43:10)
at Protocol.write (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/protocol/Protocol.js:38:16)
at Socket.<anonymous> (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/Connection.js:88:28)
at Socket.<anonymous> (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/Connection.js:526:10)
at Socket.emit (events.js:315:20)
at addChunk (internal/streams/readable.js:309:12)
--------------------
at Protocol._enqueue (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/protocol/Protocol.js:144:48)
at Connection.query (/Volumes/NO NAME/College/Computing/NEA/hypstats/node_modules/mysql/lib/Connection.js:198:25)
at Object.hourly (/Volumes/NO NAME/College/Computing/NEA/hypstats/utils/gen.js:32:33)
at processTicksAndRejections (internal/process/task_queues.js:93:5) {
code: 'ER_PARSE_ERROR',
errno: 1064,
sqlMessage: "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 'desc, category) VALUES ('STOCK_OF_STONKS', 'Stock Of Stonks', 'oddities')' at line 1",
sqlState: '42000',
index: 0,
sql: "INSERT INTO items (id, desc, category) VALUES ('STOCK_OF_STONKS', 'Stock Of Stonks', 'oddities')"
}
Комментарии:
1. Что произойдет, если вы проверите
err
параметр в обратном вызове?2. Ведение
err
журнала, похоже, напечатало загадочную ошибку, которая по какой-то причине скрывалась. В нем говорится, что в моем синтаксисе есть ошибка, хотя я не уверен, где это?
Ответ №1:
используйте его:
bot.con.query("insert into items set ?", {id: X, desc: Y, category: Z})
X , Y и Z-ваши переменные.
Ответ №2:
Попробуйте изменить свою программу, чтобы использовать этот код.
let itemInfo = Object.entries(item);
let query = `INSERT INTO items (id, desc, category) VALUES ('${itemInfo[0][0]}', '${itemInfo[0][1]}', '${categoryName}')`;
bot.con.query(query, (err, rows) => {
if (err) return console.error ('query error', query, err);
});
Вы увидите свой запрос на ВСТАВКУ и, вероятно, сможете определить свою проблему. Ваша проблема, вероятно, заключается в строке данных, содержащей '
где-то символ.
Чтобы исправить это, измените свой код на что-то вроде этого (не отлажено)
let itemInfo = Object.entries(item);
let query = 'INSERT INTO items (id, desc, category) VALUES (?, ?, ?)';
bot.con.query(query, [itemInfo[0][0], itemInfo[0][1], categoryName],
(err, rows) => {
if (err) return console.error ('query error', query, err);
});
Это так называемый параметризованный запрос. Это позволяет избежать '
проблемы и избежать SQL-инъекции.