Не выполнено ограничение NOT NULL при массовой вставке - PullRequest
1 голос
/ 28 октября 2019

Я обнаружил, что у меня проблемы с использованием параметризованных операторов вставки с версией sqlite3 4.1.0 . Вот базовый пример, демонстрирующий ошибку:

let sqlite3 = require("sqlite3");

let data = [
    [1, 1, 1],
    [2, 2, 2],
    [3, 3, 3]
];

let db = new sqlite3.Database(":memory:")
    .run(`CREATE TABLE TEST(
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    count INTEGER NOT NULL,
    xPos REAL NOT NULL,
    yPos REAL NOT NULL
)`, (err) => {
        if (err) {
            console.log(err);
        } else {
            insertRecords();
        }
    });

insertRecords = () => {
    db.all(`INSERT INTO TEST(count, xPos, yPos) VALUES(?,?,?)`, data, (err, rows) => {
        if (err) {
            console.log(err);
        } else {
            for (let i = 0; i < rows.length; i++) {
                console.log(rows[i]);
            }
        }
    });
};

Если я выполню этот код, я получу ошибки в следующих строках:

[Error: SQLITE_CONSTRAINT: NOT NULL constraint failed: TEST.count] {
  errno: 19,
  code: 'SQLITE_CONSTRAINT'
}

Проблема возникает в первой строке insertRecords. Там я пытаюсь протолкнуть несколько записей в БД, используя массив данных. Согласно нескольким источникам, это должен быть путь.

Кажется, что независимо от того, что я делаю, параметр data, кажется, не анализируется правильно. Я пробовал аналогичные конструкции с подготовленными операторами и другими методами, которые позволяют мне передавать параметр params.

Теперь вполне возможно, что я делаю что-то глупое, но я протестировал довольно много вещей, и я 'м из идей. У кого-нибудь еще есть такая же проблема?

1 Ответ

0 голосов
/ 28 октября 2019

Вам необходимо добавить заполнители (?,?,?) для каждой строки в data.

Измените начало функции insertRecords на:

const placeHolders = data.map((row) => '(?,?,?)').join(',');

db.all(`INSERT INTO TEST(count, xPos, yPos) VALUES ${placeHolders}`, data, (err, rows) => {

См. здесь для получения дополнительной информации

Если вы хотите легко писать и обрабатывать запросы - попробуйте knex , это избавит вас от многих проблем.

Ваш случай дляпример:

let data = [
  {count: 1, xPos: 1, yPos: 1},
  {count: 2, xPos: 2, yPos: 2},
  {count: 3, xPos: 3, yPos: 3}
];
db.insert(data).into('test').then(result => {})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...