TypeORM批量插入

在 TypeORM 中,批量插入数据可以通过多种方法实现,包括 save、insert 和 createQueryBuilder。这些方法各有优缺点,适用于不同的场景。

使用 createQueryBuilder 进行批量插入

createQueryBuilder 是性能最优的批量插入方法。以下是一个示例:

await dataSource
.createQueryBuilder()
.insert()
.into(User)
.values([
{ firstName: "Timber", lastName: "Saw" },
{ firstName: "Phantom", lastName: "Lancer" },
])
.execute();

这种方法在插入大量数据时非常高效1。如果不需要插入数据后的 ID,可以通过设置 updateEntity(false) 来避免额外的 SELECT 查询:

entityManager
.createQueryBuilder()
.insert()
.into("user")
.values(users)
.updateEntity(false)
.execute();

使用 save 方法进行批量插入

save 方法也可以用于批量插入,但它会触发实体监听器和订阅者,并返回保存后的对象,包括自动生成的 ID:

let userRepository = connection.getRepository(User);
let users = userRepository.create([
{ name: '张三' },
{ name: '李四' }
]);
let result = await userRepository.save(users);
console.log(result);

save 方法适用于需要处理实体监听器和订阅者的场景2

处理插入冲突

在并发情况下,插入数据可能会出现主键冲突。可以使用 ON DUPLICATE KEY UPDATE 语句来处理这种情况:

await connection.createQueryBuilder()
.insert()
.into(Post)
.values(post2)
.onConflict(`("id") DO UPDATE SET "title" = :title`)
.setParameter("title", post2.title)
.execute();

这种方法可以有效地处理主键冲突,并更新已有记录1

总结

在 TypeORM 中,批量插入数据可以通过 createQueryBuilder、save 和 insert 方法实现。根据具体需求选择合适的方法,可以提高插入效率并处理可能的冲突。

posted on 2024-10-20 16:21  漫思  阅读(191)  评论(0编辑  收藏  举报

导航