📑

typeorm-seedingでトランザクションを組む

2022/08/23に公開

typeorm-seedingでのデモデータ投入でトランザクションを組みたかったのですが、調べてもトランザクションについて特に見つからなかったので対応したことをこちらに書きます。

利用したもの

typeorm-seeding v1.6.2

connection.transaction

typeormでのtransactionの使い方はいろいろありそうだが、今回はconnection.transactionを使う。
https://orkhan.gitbook.io/typeorm/docs/transactions

create()は使わずにmake()を利用

create()は内部で新たにconnectionを作成しinsertを行うため、外からtransactionを組めない。
create()は利用せずにentityを作成するだけのmake()を利用する。

都度saveしていく

transactionの処理の中でmanagerを使えるので、それを利用してそれぞれmanager.save()していく

make()で単体のentityでも、makeMany()entityの配列の場合でも問題なくsaveできる。
saveした後はuserを参照すればidも取得できる。

作成したコード

transaction以外の基本的な実装は公式を参照

create.seeds.ts
import { Connection, EntityManager } from 'typeorm';
import { Factory, Seeder } from 'typeorm-seeding';
import { User } from './user.factory';
import { Pet } from './pet.factory';

export default class CreateUser implements Seeder {
  public async run(factory: Factory, connection: Connection): Promise<any> {
    await connection.transaction(async (manager: EntityManager) => {
      const user = await factory(User)().make();
      await manager.save(user);
      
      const pets = await factory(Pet)().makeMany(5);
      await manager.save(pets);
    });
  }
}

おそらく今後もcreate()を使うことはなさそう。

Discussion