所以我最近一直在玩Knex,但是我发现自己陷入了一种不知道该怎么办的境地。
所以我有这个查询:
knex.raw("INSERT INTO tablename (`col1`, `col2`, `col3`) VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE col2 = VALUES(`col2`)",
[
['val1', 'hello', 'world'],
['val2', 'ohayo', 'minasan'],
]);
由于某些原因,它抛出了一个错误Expected 2 bindings, saw 3
.
我试着让它:
knex.raw("INSERT INTO tablename (`col1`, `col2`, `col3`) VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE col2 = VALUES(`col2`)",
['val1', 'hello', 'world'],
['val2', 'ohayo', 'minasan'],
);
这次没有错误,但它只插入第一个数组。
我还尝试将值设置为对象:
[
{col1: 'val1', col2: 'hello', col3: 'world'},
{col1: 'val2', col2: 'ohayo', col3: 'minasan'},
]
但还是没有运气。
5条答案
按热度按时间sgtfey8w1#
我编写了以下代码,以插入/更新作为对象的单行或作为对象数组的多行:
chy5wohz2#
如果一次只需要插入固定数量的行,可以尝试以下操作:
如果不知道一次需要插入多少个,可以编写一个脚本,根据需要多次添加
(?, ?, ?),
。hwamh0ep3#
如果你使用的是PostgreSQL,Nathan的解决方案就不起作用了,因为没有
ON DUPLICATE KEY UPDATE
。所以在PostgreSQL中你应该使用ON CONFLICT ("id") DO UPDATE SET
:如果您使用的是
Objection.js
(knex的 Package 器),那么(在这种情况下,不要忘记导入knex):sy5wg1nm4#
1hdlvixo5#
2022更新
我现在使用onConflict来实现这个功能,它适用于PostgreSQL、MySQL和SQLite数据库
假设我有一个表,表名为
key
和value
,表中包含主键或唯一键使用方法:
如果键值组合存在,它将简单地根据
insert
函数中的字段更新值。对于多个值
您只需在
insert
中传递一个数组即可: