我正在尝试将练习列表插入到 sqlite DB 中。该应用程序基于 Express JS,我使用
sqlite3
和 knex
与数据库交互。我正在尝试将练习列表添加到表中exercisesDB
,但前提是使用 knex 事务表中尚不存在练习名称:
await knex.transaction(async (trx) => {
for (const exercise of exercisesToAdd) {
await trx('exercisesDB').insert(exercise).onConflict('name').ignore()
}
})
但我收到一个错误 [错误:在冲突时插入
exercisesDB
[数据] (name
) 不执行任何操作 - SQLITE_CONSTRAINT:唯一约束失败:exerciseDB.id]
似乎
knex
正在检查id
约束(我没有在exercisesToAdd
列表中传递)而不是name
约束
会不会是膝盖问题?
我尝试将 then catch 添加到 trx 中,以便代码看起来像:
await knex.transaction(async (trx) => {
exercisesToAdd.forEach(
(exercise) => await trx('exercisesDB').insert(exercise).onConflict('name').ignore().then(trx.commit).catch(trx.rollback)
)
})
您的
name
列是否已经有 UNIQUE
约束?如果没有,您需要将其添加到数据库架构中,然后才能起作用。
请参阅 knex.js 文档此处:
对于 PostgreSQL 和 SQLite,此方法指定的列必须是表的 PRIMARY KEY 或具有 UNIQUE 索引,否则查询将无法执行。指定多列时,它们必须是复合 PRIMARY KEY 或具有复合 UNIQUE 索引。
好像默认会检查PK,否则...