Knex.Js 在 PostgreSQL 上使用 BatchInsert 忽略重复项

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

对于使用 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

Documentation Example

javascript duplicates insert psql knex.js
1个回答
0
投票

.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;
};
© www.soinside.com 2019 - 2024. All rights reserved.