Knex构造带on conflict where条件的插入语句时where子句丢失问题
问题根源
你代码里的where条件写在了onConflict方法之前,Knex不会将这部分条件识别为ON CONFLICT分支的过滤规则,同时原生INSERT语句本身不支持全局WHERE条件,因此这部分逻辑会被直接忽略。另外你使用whereNotIn进行单值不等于判断属于语法误用,且字段前缀的表名拼写和实际表名不匹配。
正确写法
将WHERE条件移动到onConflict之后,使用正确的条件方法即可:
let result = knex('members').withSchema('public').insert(insertParameters); result = result .onConflict(['emp_id', 'plan_id']) .whereNot('responsibility', 'admin') // 冲突分支的过滤条件放在onConflict之后 .ignore(); result = await result.returning('id'); return result;
上述代码会正确生成带WHERE条件的ON CONFLICT逻辑,符合你的原生SQL需求。
注意事项
- Knex从
0.95.0版本开始支持ON CONFLICT后接WHERE条件的写法,如果你的依赖版本过低,请先升级Knex到最新稳定版。 - 如果你需要更复杂的冲突分支逻辑,也可以通过
knex.raw手写冲突部分的SQL实现。
内容的提问来源于stack exchange,提问作者Nayan Patel
相关产品推荐
相关产品推荐

