Обновление значения в SQL (лучше-sqlite3) с помощью Node.JS

#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.html

4. @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.