📑
typeorm-seedingでトランザクションを組む
typeorm-seedingでのデモデータ投入でトランザクションを組みたかったのですが、調べてもトランザクションについて特に見つからなかったので対応したことをこちらに書きます。
利用したもの
typeorm-seeding v1.6.2
connection.transaction
typeormでのtransactionの使い方はいろいろありそうだが、今回はconnection.transactionを使う。
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