runoops.com

TypeORM Upsert

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() 方法来完成这项工作。

Captcha Code

0 笔记

分享笔记

Inline Feedbacks
View all notes