👋
Prisma の Seed ファイルを複数にする方法
Prisma の seed ファイルを本番環境用と開発環境用とで分けて管理したくなったので、どのように対応するのか調査しました。
通常の seed 登録方法
まず、公式ドキュメント 通りに Seeding する方法です。
- package.json に prisma の seed キーを定義する
"prisma": {
"seed": "ts-node prisma/seed.ts"
},
- seed.ts ファイルに seed スクリプトを書く
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function main() {
const alice = await prisma.user.upsert({
where: { email: 'alice@prisma.io' },
update: {},
create: {
email: 'alice@prisma.io',
name: 'Alice',
posts: {
create: {
title: 'Check out Prisma with Next.js',
content: 'https://www.prisma.io/nextjs',
published: true,
},
},
},
})
const bob = await prisma.user.upsert({
where: { email: 'bob@prisma.io' },
update: {},
create: {
email: 'bob@prisma.io',
name: 'Bob',
posts: {
create: [
{
title: 'Follow Prisma on Twitter',
content: 'https://twitter.com/prisma',
published: true,
},
{
title: 'Follow Nexus on Twitter',
content: 'https://twitter.com/nexusgql',
published: true,
},
],
},
},
})
console.log({ alice, bob })
}
main()
.catch((e) => {
console.error(e)
process.exit(1)
})
.finally(async () => {
await prisma.$disconnect()
})
- コマンドで seed を登録する
$ prisma db seed
package.json に設定したことで prisma migrate dev
や prisma migrate reset
を実行したときにも seed が登録されます。
( --skip-seed でスキップできます )
seed.ts ファイルを分ける
上記の方法だと seed.ts ファイルを1つしか作成できないように見えますが、複数のファイルに分割することもできます。
今回は本番環境と開発環境の2つの seed.ts ファイルを用意します。
- prisma/seed.ts
- prisma/seed-dev.ts
コマンドを分ける
seed を実行するコマンドは、 prisma db seed
だけではありません。
ts-node で直接実行することができます。
$ npx ts-node prisma/seed-dev.ts
使いやすくするために package.json にコマンドを用意しておくと良いでしょう。
"scripts": {
"db:seed-dev": "npx ts-node prisma/seed-dev.ts"
}
シェルを作成する
さらに複数のファイルに分けたい場合はコマンドを分けるのも手間になるので、シェルにまとめて実行すると良いです。 prisma/seed.sh
というファイル名にしておくと prisma migrate dev
したときに自動実行してくれます。
#!/bin/sh
# -e Exit immediately when a command returns a non-zero status.
# -x Print commands before they are executed
set -ex
# Seeding command
go run ./seed/
以上
参考サイト
Seeding your database (公式)
Discussion