gpt4 book ai didi

node.js - 批量插入时 NOT NULL 约束失败

转载 作者:太空宇宙 更新时间:2023-11-04 01:23:00 25 4
gpt4 key购买 nike

我发现在 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 参数。

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

最佳答案

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

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 => {})

关于node.js - 批量插入时 NOT NULL 约束失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58588532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com