在具有唯一字段约束的expressJS上使用knex将条目列表插入到sqlite中

问题描述 投票:0回答:1

我正在尝试将练习列表插入到 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)
      )
    })
javascript express sqlite knex.js node-sqlite3
1个回答
0
投票

您的

name
列是否已经有
UNIQUE
约束?如果没有,您需要将其添加到数据库架构中,然后才能起作用。

请参阅 knex.js 文档此处

对于 PostgreSQL 和 SQLite,此方法指定的列必须是表的 PRIMARY KEY 或具有 UNIQUE 索引,否则查询将无法执行。指定多列时,它们必须是复合 PRIMARY KEY 或具有复合 UNIQUE 索引。

好像默认会检查PK,否则...

© www.soinside.com 2019 - 2024. All rights reserved.