Upsert(该术语由更新和插入两个词组合而成)是一种数据库操作,用于更新表中已存在的记录。否则,如果该记录不存在,则插入一条新记录。
这篇文章简洁实用,告诉你如何在 TypeORM 中执行 upsert 操作。您可以使用查询生成器(非常灵活)或 upsert() 方法(非常简洁)。另一种可能的解决方案是使用 save() 方法(只有当您提供 id - 主键时才有效)。
使用 Query Builder
假设我们有一个名为 User 的实体,声明如下(电子邮件地址是唯一的):
// runoops.com
// User entity
import { Entity, PrimaryGeneratedColumn, Column, Unique } from 'typeorm';
@Entity()
@Unique(['email'])
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
email: string;
@Column()
name: string;
}
然后,我们就可以像这样进行更新或添加:
const userRepository = myDataSource.getRepository(User);
userRepository
.createQueryBuilder()
.insert()
.into(User)
.values([
{ email: 'hello@runoops.com', name: 'Hello' },
{ email: 'goodbye@runoops.com', name: 'Goodbye' },
])
.orUpdate({ conflict_target: ['email'], overwrite: ['name'] })
.execute();
如果数据库中已有电子邮件,则会更新该用户的名称。否则,将使用所提供的电子邮件地址和姓名创建一个新用户。
使用 upsert() 方法
upsert() 方法可以直观、方便地实现目标:
const userRepository = myDataSource.getRepository(User);
await userRepository.upsert(
[
{ email: 'hello@runoops.com', name: 'Hello Update' },
{ email: 'goodbye@runoops.com', name: 'Goodbye New Update' },
],
['email']
);
AuroraDataApi、Cockroach、Mysql、Postgres 和 SQLite 数据库驱动程序支持此方法。
使用 save() 方法
使用save() 方法看似简洁优雅,但这种方法只有在提供 ID 时才有效:
const userRepository = myDataSource.getRepository(User);
await userRepository.save([
{ id: 1, email: 'hello@runoops.com', name: 'Hello Update' },
{ id: 2, email: 'goodbye@runoops.com', name: 'Goodbye Update' },
]);
我想大多数人会更喜欢使用 upsert() 方法来完成这项工作。
分享笔记