🦖

NestJS*Prismaでサンプルデータを作りたい!

2023/06/30に公開

株式会社ウェイブで新規サービスの開発を行なっています、こしけです!

今回はNestJS*Prisma環境で開発中にfactory_botの様な感じで簡単にサンプルデータが作れる方法が無いかなと探していた際に、prisma-fabbricaという便利なライブラリを見つけましたのでご共有です!
こちらのライブラリのおかげでサンプルデータの作成がとても楽になりました、、、!
作成者の方には本当に感謝です🙇

前置きはこの辺にして早速使い方を見ていきましょう!
基本的にライブラリのreadmeを見ていただければ使い方等は分かると思うので、使い方等は参考程度に見ていただければと思います!

前提

  • 今回使うデータモデルの定義
model User {
  id        Int      @id @default(autoincrement())
  name      String
  posts     Post[]
}

model Post {
  id        Int      @id @default(autoincrement())
  title     String   @db.VarChar(255)
  author    User    @relation(fields: [authorId], references: [id])
  authorId  Int
}

導入

  • prisma-fabbricaのインストール
npm i @quramy/prisma-fabbrica --dev
  • schema.prismaの編集
    • outputはファイルの作成場所を指定します。
generator fabbrica {
  provider = "prisma-fabbrica"
  output   = "../fabbrica"
}
  • 下記コマンドを実行
    • このコマンドを実行すると先ほど指定したフォルダの配下に型定義やヘルパーが記載されたファイルが作成されます。
npx prisma migrate dev
  • ファイルが生成されれば導入は完了です!

使い方

userを作る場合

  • 基本的なデータの作り方
seed.ts
import { PrismaClient } from '@prisma/client';
import { initialize, defineUserFactory } from "../fabbrica/index";

const prismaClient = new PrismaClient();
initialize({ prismaClient })

async function main() {
	// factoryの定義
	const factory = defineUserFactory();
	// データを一つ作る場合
	await factory.create()
	// データを複数作る場合(引数に作りたい数を指定します。)
	await factory.createList(2)
}

main()
  .catch((e) => console.error(e))
  .finally(async () => {
    await prismaClient.$disconnect();
});

  • フィールドの値を指定した状態のデータの作り方
    • factoryの定義時に指定したいフィールドを選択し、値を指定します。
// factoryの定義
const factory = defineUserFactory({
  defaultData: async () => {
    name: 'hogehoge',
  }
})
// nameがhogehogeの状態のユーザが作成されます
await factory.create()

  • フィールドの値を指定する場合に連番を使いたい場合
    • 重複を許容していないカラムの値を指定したい場合などに便利ですね!
    • 連番をリセットするresetSequenceというメソッドも存在しているみたいです!
// factoryの定義
const factory = defineUserFactory({
  defaultData: async ({seq}) => {
    name: `hogehoge${seq.toString()}`,
  }
})
// nameがhogehoge1の状態のユーザが作成されます
await factory.create()

post(関連付けされたデータ)を作る場合

  • postと一緒にuserも作成したい場合
seed.ts
import { PrismaClient } from '@prisma/client';
import { initialize, defineUserFactory, definePostFactory } from "../fabbrica/index";

const prismaClient = new PrismaClient();
initialize({ prismaClient })

async function main() {
  // factoryの定義
  const userFactory = defineUserFactory();
  const factory = definePostFactory({
    defaultData: {
      author: userFactory,
    },
  });
  // 下記を実行するとpostとそれに紐づくuserが作成されます
  await factory.create()
  
  // データを複数作るとその分紐づくデータも作成されます
  // 例えば下記を実行するとuserのデータも2つ作成されるといった感じです
  await factory.createList(2)
}

main()
  .catch((e) => console.error(e))
  .finally(async () => {
    await prismaClient.$disconnect();
});

  • 指定したuserに紐づくpostを作成したい場合①
const userFactory = defineUserFactory();
// userデータの作成
const user = await userFactory.create()

const postFactory = definePostFactory({
  defaultData: async () => ({
    author: {
      connect: {
        id: user.id,
      },
    },
  }),
});

// 上記で作成したuserに紐づくpostのデータが作成されます
await postFactory.create()

  • 指定したuserに紐づくpostを作成したい場合②
const userFactory = defineUserFactory();
// userデータの作成
const user = await userFactory.createForConnect()

const postFactory = definePostFactory();
// 上記で作成したuserに紐づくpostのデータが作成されます
await postFactory.create({ author: { connect: author } })

この様な感じで関連付けされたデータも簡単に作成することが出来ます!!


seed.tsファイルに自分の作りたいデータを定義した上でPrismaのseedコマンド[1]を実行するとデータが作成されているのが確認出来ると思います!

最後に

この辺のサンプルデータ作成は自前でやると結構大変な部分なので、この様なライブラリがあるのはとてもありがたいですね、、、!
とても便利なライブラリですので、ぜひ皆さんも使ってみてください!
ちなみに僕たちのチームではデバッグ用のサンプルデータを作成する際にも利用していたのですが、テストの際にテストデータを作成するのにもかなり利用させていただきました。
テストのフレームワークはjestを使っているのですが、そこでprisma-fabbricaを使う際に少しハマった箇所がありましたので、そちらも今後記事に出来ればと思っています!

宣伝

株式会社ウェイブでは、電子コミックやアニメ配信サービスなどを自社開発で運営しております。
新しい技術を積極的に取り入れているモダンな環境が整っているウェイブで一緒に働いてみませんか?
興味ある方は是非こちらをご覧ください!

https://hrmos.co/pages/wwwave

脚注
  1. https://www.prisma.io/docs/guides/migrate/seed-database ↩︎

wwwave's Techblog

Discussion