#sql #node.js #sqlite #sql-update #better-sqlite3
#sql #node.js #sqlite #sql-обновление #лучше-sqlite3
Вопрос:
В настоящее время у меня есть база данных людей с каждым отдельным пользователем, и они содержат значение статуса. Я пытаюсь изменить их значение статуса.
const id = parseInt(req.params.id , 10);
const { valid, messageObj } = validateId(id);
if (!valid) {
res.status(400).send(messageObj);
}
let { status, priority } = req.body;
let people = db.prepare('select * from people').all();
const person = people.find(person => person.id === id);
if(status !== 'none' amp; status == 'ready' || status == 'done'){
let updates = db.query(
'UPDATE people SET ? WHERE ?',
[{ status: status }, { id: id }]
);
}
Я продолжаю получать ошибку db.query is not a function
, но я получаю это для каждой функции, которую я пробую.
Довольно новичок в SQL, но просто пытаюсь разобраться в этом или в какой-либо документации, которая поможет мне, поскольку better-sqlite3 не имеет никаких update
функций в официальной документации.
Ответ №1:
Я не могу найти функцию, вызываемую query()
в API better-sqlite3 для Database
класса. Я думаю, что вам понадобится prepare()
Statement
объект, затем run()
это.
Кроме того, имена столбцов нельзя передавать как связанные параметры. Ваш запрос должен выглядеть следующим образом:
UPDATE people SET status = ? WHERE name = ?
Вам нужно будет изменить это:
let updates =
db.query('UPDATE people SET ? WHERE ?', [{ status: status }, { id: id }]);
Для:
const stmt = db.prepare('UPDATE people SET status = ? WHERE id = ?');
const updates = stmt.run(status, id);
Комментарии:
1. Сжатый
const info = db.prepare('update people set status = ? where id =?').run(status,id);
, если вы хотите2.
Also, column names cannot be passed as bound parameters.
Он поддерживает связанные параметры, см., например, github.com/WiseLibs/better-sqlite3/blob/master/docs /… и пример в github.com/WiseLibs/better-sqlite3/blob/master/docs /… — вы хотите сказать, что, хотя они поддерживаются из INSERT, они по какой-то причине не поддерживаются в инструкциях UPDATE?3.
bind-parameter
является частьюexpr
синтаксиса на sqlite.org/lang_update.html4. @ChrisW: да, он поддерживает параметры привязки для передачи значений , но не других элементов, таких как, например, имя столбца или название таблицы. В
insert
примере, который вы связали, привязаны именно значения. Имейте в виду, что база данных должна иметь возможность подготовить инструкцию, используя только строку запроса (не параметры привязки) ; это было бы невозможно сделать, если бы отсутствовала структурная информация, такая как имя столбца.
Ответ №2:
В соответствии с шаблонами вы можете использовать синтаксис javascript для замены переменных на их значения.
let updates = db.exec(`UPDATE people SET status='${status}' WHERE id='${id}'`);
Комментарии:
1. Это небезопасно. Это позволяет внедрять SQL. Exec не выполняет никакого экранирования.
2. Я вижу, prepare приведет к удалению ошибки при попытке выполнения внедрения кода, но вы должны обработать это задолго до инструкции sql. Вы должны проверить значение переменной status перед использованием шаблона, и в случае попытки внедрения вам придется отказаться и завершить процедуру до sql, поэтому, пожалуйста, отделите безопасные проблемы от метода replace.