【问题标题】:NOT NULL constraint failed with bulk insertNOT NULL 约束因批量插入而失败
【发布时间】:2019-10-29 03:02:20
【问题描述】:

我发现我在使用带有 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 参数的方法的类似构造。

现在很可能我正在做一些愚蠢的事情,但是我测试了很多东西并且我没有想法。其他人有同样的问题吗?

【问题讨论】:

    标签: node.js sqlite


    【解决方案1】:

    您需要为data 中的每一行添加占位符(?,?,?)

    insertRecords函数的开头改为:

    const placeHolders = data.map((row) => '(?,?,?)').join(',');
    
    db.all(`INSERT INTO TEST(count, xPos, yPos) VALUES ${placeHolders}`, data, (err, rows) => {
    

    更多信息请见here

    如果您想轻松编写和操作查询 - 试试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 => {})
    

    【讨论】:

    • 感谢您的回答。可悲的是,它似乎并没有奏效,在采纳您的建议后,我仍然遇到同样的错误。
    • 发帖前我测试了一下,没有报错。
    • 抱歉,我打错了,现在检查
    • 我之前确实看到了错字。您是否偶然更改了数据数组?当我把它奉承并使用你的建议时,似乎我得到了它。
    • 我没有碰数据数组。我很高兴你让它工作。如果您能接受它作为正确答案,那就太好了。
    猜你喜欢
    • 2018-12-16
    • 2015-04-22
    • 1970-01-01
    • 2016-04-07
    • 2018-08-24
    • 2022-01-19
    • 2021-11-16
    • 2020-12-18
    • 2021-03-20
    相关资源
    最近更新 更多