Prismaを複数プロジェクトで使用する方法
Backend
Prisma
初めに
Prismaは、最近注目を浴びているORMです。
Prismaはモデルの定義がシンプルで、メソッドもわかりやすいものが多いです。開発者はより簡単にデータベースにアクセスすることができ、より高速に開発することができます。
公式のクイックスタートでは、1からディレクトリを作成してPrismaを使用する方法を載せています。
ではこのPrismaを複数プロジェクトで使用するにはどうすれば良いでしょうか?
ケースとしては、
画面周りをNext.jsで作成しているが、一般向け画面と管理者画面で別々に開発している
Nest.jsを使って、機能毎にAPIを作成している
とかでしょうか。
結論
いきなり結論を言ってしまうと、
Prisma用のリポジトリを用意し、各プロジェクトはgit submoduleでPrismaを取り込む
各プロジェクトでPrismaを用意するが、マイグレーションを行うプロジェクトは1つだけで、その他は,db pull,でスキーマ情報を取得する。
くらいかなと思います。
個人的には、前者を推します。後者は考えることが多くなる(二元管理っぽくて辛そう)ので、前者の方がシンプルです。
Prismaをgit submoduleで管理
git submodule
ある Git リポジトリを別の Git リポジトリのサブディレクトリとして扱うことができるようになります。(詳細)
つまり、今回の目的である「複数プロジェクトでPrismaを使用したい」にバッチリあった機能というわけです。
詳しい使い方はこちらをご覧ください
各プロジェクトでのPrismaの使用
PrismaClientの生成
PrismaClientは、submoduleの中で実行する必要があります。
また、個人的には生成先も指定した方がいいかもしれません。
defaultではschema.prismaの存在する場所に生成されますので、submoduleの中に生成されます。
個人的には、各プロジェクトに生成した方がスッキリするので、
generator client {
provider = "prisma-client-js"
output = "<Project Path>/generated/client"
}
このように生成先を指定するのを推します。
generated をgitignoreするのを忘れずに。
PrismaClientのimport
公式で記載されている方法とは少し違います。
// 公式
// import { PrismaClient } from '@prisma/client'
// submodule使う場合
import { PrismaClient } from '../<Project Path>/generated/client'
const prisma = new PrismaClient()
注意点
こちらにも記載されている通り、NuxtjsやNextjsでそのまま上記のように使用すると、開発時のホットリロードが原因で警告が出ると思いますので、開発時は単一のインスタンスになるよう設定しましょう。
終わりに…
以上の方法で、複数プロジェクトでPrismaを使用することができます。git submoduleを使用する場合は、各プロジェクトでPrismaClientを生成する必要があります。
その他の方法は、マイグレーションを行うプロジェクトを1つにまとめることができます。
どちらの方法を選択するかは、プロジェクトの規模や特性によって異なりますが、git submoduleを使用する方法が、よりシンプルで柔軟性があるため、お勧めします。