Проблемы при попытке массовой вставки массива пользователей в Node - PullRequest
0 голосов
/ 14 января 2019

Я потратил много времени на рассмотрение всех предоставленных решений о том, как выполнить массовую вставку с Node (в частности, здесь , здесь и здесь ), но я все еще не могу вставить несколько строк из списка пользователей.

Мой массив выглядит так:

[ [ 'user 1' ], [ 'user 2' ], [ 'user3' ] ]

И мой код следующий:

let insert_sql = "INSERT IGNORE INTO followers (username) VALUES (?)"
  await connection.execute(insert_sql, [users], function (err, result) {
    if (err) throw err
    console.log("Number of records inserted: " + result.affectedRows)
  })

Но он только вставляет всех пользователей в один ряд ... Я использую пакеты npm и mysql2, может, проблема в этом?

1 Ответ

0 голосов
/ 18 января 2019

Вам нужно изменить на .query(), чтобы он создавал более длинный запрос на стороне клиента, или используйте .execute и сериализуйте ваши вставные данные в / из одного параметра (например, используя поле JSON и хранимую процедуру) или используйте соответствующий номер заполнители в тексте запроса let insert_sql = "INSERT IGNORE INTO followers (username) VALUES (?, ?, ?)"; await connection.execute(insert_sql, [users]).

Вот мой ответ , объясняющий разницу между выполнением и запросом: «Почему IN? Не работает с выполнением?» вопрос:

.execute () под капотом делает команды подготовки + выполнения

запрос против выполнения шаг за шагом:

запрос:

формат sql на клиенте: 'ВЫБЕРИТЕ id ИЗ mytable WHERE ID IN (?)' + [ [1,2,3]] становится «SELECT id From mytable WHERE id IN (1, 2, 3)» send Команда COM_QUERY с «SELECT id FROM mytable WHERE id IN (1, 2, 3)» Выполнить чтение полей + строк:

отправить команду COM_PREPARE с идентификатором SELECT FROM mytable WHERE id IN (?) в качестве параметра запроса прочитайте подготовленный результат оператора (id + параметры + поля результата, если известны из запроса). Для этого запроса есть один параметр (один?). id это число, обычно начинается с 1 для каждого соединение (не уникально для сервера, вы не можете подготовить заявление в одно соединение и использование в другом) отправьте команду COM_EXECUTE, используя идентификатор оператора + параметры. Параметры должны быть простыми типами mysql, и в настоящее время все параметры приводятся к строкам и сериализуются как строки (за исключением параметров Buffer, они отправляются как есть). В вашем Например, "пожалуйста, выполните stmt с идентификатором 1 и одним параметром, который является строка "1,2,3" Результат из подготовительного шага выше кэшируется, а следующий выполнять команды только с одним запросом 'COM_EXECUTE' часть выполнена

Я согласен, что это сбивает с толку, но это как подготовленное заявление Работа. Мы должны улучшить это с помощью лучшей документации и, возможно, некоторых предупреждения / ошибки проверки параметров типа _ "эй, вы уверены, что хотите отправить параметр {foo: 'bar'} в подготовленный оператор? Это будет отправлено как [объект объекта]! ''

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...