对于使用 Knex.Js 进行常规插入,您可以执行类似的操作,以便在插入时忽略任何重复项:
knex('tableName')
.insert({
email: "[email protected]",
name: "John Doe"
})
.onConflict('email')
.ignore()
我正在尝试为batchInsert执行此操作,但我仍然收到重复的错误:
const newUsers = await knex.batchInsert("user", filteredUsers, 1000).returning('email').onConflict('userId')
.ignore();
有没有办法用batchInsert来做到这一点?
文档提供了这个示例,但它是使用常规 Insert 方法完成的,而不是使用 batchInsert。我尝试过但没有成功 https://knexjs.org/guide/query-builder.html#onconflict
.batchInsert
(源代码这里和文档这里)只是一个包装.insert
的util函数。
它将要插入的项目列表拆分为块(通过 lodash chunk),如果未提供
chunkSize
,则默认大小为 10k,然后在 1 个事务中按顺序插入这些块。
如果您想要忽略冲突的批量插入,您可以执行以下操作:
const batchInsertIgnoreOnConflict = async (users: User[]): Promise<User[]> => {
const chunkedUsers = chunk(users, 1_000);
const insertedUsers: User[] = [];
await knex.transaction(async (trx) => {
for (const chunk of chunkedUsers) {
insertedUsers.push(
await trx<User>('users')
.insert(chunk)
.returning('email')
.onConflict('userId')
.ignore()
);
}
});
return insertedUsers;
};