Prisma2でschemaファイルを分割して管理する

はじめに

最近Prismaを使い始めたんですが schema.prisma が肥大化していって辛くなってきたので分割を考えました

分割方法を調査

調べたところ、同じことを思ってる人はいるようでissueがありました

Prisma1の場合はPrismaがよしなにしてくれたようなのですが、2にはその機能がないみたいなので自前でmergeするみたいです

github.com

そこで紹介されているこちらのパッケージを使ってみます

github.com

分割する

現在 prisma init すると prisma/schema.prisma が生成されるので

prisma フォルダ内で作業します

まず base.schema を作ります

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

base.schema にはdatasourceやgeneratorの設定を入れます

次に models フォルダに各Modelを1ファイルごとに入れていきます

models/User.prisma

model User {
  id      Int      @id @default(autoincrement())
  email   String   @unique
  name    String?
  posts   Post[]
}

models/Post.prisma

model Post {
  id         Int         @id @default(autoincrement())
  createdAt  DateTime    @default(now())
  title      String
  published  Boolean     @default(false)
  author     User        @relation(fields: [authorId], references: [id])
  authorId   Int
  categories Category[]  @relation(references: [id])
}

VSCodePrismaの拡張をインストールしていると参照エラーが出ますが気にしないでいきます

最後にコマンドを実行します

デフォルトだと src 以下になっているので各パスを指定します

npx prisma-merge --baseFile prisma/base.prisma --schemaFilePatterns 'prisma/*/*.prisma' --outputFile prisma/schema.prisma

このとき --schemaFilePatterns prisma/*/*.prisma のようにクォートで囲まないと展開されてエラーになってしまうので注意

prisma/schema.prisma が生成されていれば成功です