📑
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