TypeORM Upsert:如果存在则更新,如果不存在则创建

Upsert(这个术语由两个词组合而成:updateinsert)是一种数据库操作,用于更新它已经存在于表中的记录。否则,如果该记录不存在,则插入一个新行。

这篇简洁实用的文章向您展示了如何在 TypeORM 中执行 upsert 操作。您可以使用查询构建器(非常灵活)或save() 方法(这仅在您提供id –主键时有效)。

使用查询生成器

假设我们有一个名为User的实体,声明如下(电子邮件地址是唯一的):

// KindaCode.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;
}

然后我们可以像这样做一个 upsert:

const userRepository = myDataSource.getRepository(User);
userRepository
      .createQueryBuilder()
      .insert()
      .into(User)
      .values([
        { email: 'hello@zaimei.com', name: 'Hello' },
        { email: 'goodbye@zaimei.com', name: 'Goodbye' },
      ])
      .orUpdate({ conflict_target: ['email'], overwrite: ['name'] })
      .execute();

如果数据库中已存在电子邮件,则将更新该用户的名称。否则,将使用提供的电子邮件地址和姓名创建一个新用户。

使用 save() 方法

使用save() 方法似乎更简洁,但这种方法仅在您提供ids时有效:

const userRepository = myDataSource.getRepository(User);
await userRepository.save([
      { id: 1, email: 'hello@zaimei.com', name: 'Hello Update' },
      { id: 2, email: 'goodbye@zaimei.com', name: 'Goodbye Update' },
]);