最近人気のprismaに入門して実際に使ってみた。
prismaって何?
「そもそもprismaって何」という人もいると思うので軽く説明。
prismaというのはNode.jsのライブラリの一つで、独自の定義ファイルと汎用関数を使ってDBの定義や操作を行える(同じような機能を持つツールやライブラリをORMと呼ぶそう)
非常に軽量でnpmでインストールしてinitコマンドを叩くだけで導入でき、MySQL・SQLite・Postgreといった大抵のDBをサポートしているのもあって非常に使いやすい。
通常やるようなDBに対してSQLを発行する方法だと返ってくるデータに型定義がされていないため予期せぬエラーが発生しがちだが、prismaの関数で取得したデータはしっかりと型定義がされているため型安全なDB処理が簡単に作れる。
さらに専用のDBブラウザ(prisma studio)も同梱されているため、別途Mysql WorkbenchやpgAdminを使用しなくてもテスト環境で使用データを簡単に参照できる。
基本的な仕様と使い方はこちら
このprisma、本番環境へのデプロイを前提にする際に考えなければいけないことが幾つか存在する。
今回は簡単な設定で解決できる3つのポイントを紹介。
1. 主キーにインデックスを付ける※超重要!
DBを扱う際の初歩中の初歩だが主キーとなるカラムや検索時のキーに使うカラムには必ずインデックスを付けよう。
これをやらないと検索時の応答速度が大幅に低下する。
// model(DBに作成するテーブルの定義)
model Post {
id Int @id @default(autoincrement())
name String
email String
created_at DateTime @default(now())
updated_at DateTime @default(now())
@@index([id]) //インデックスを設定(絶対にやろう!)
}
2. 本番デプロイ対策としてprisma clientをルート下に作成
modelの定義をprisma client(データ操作を行う関数セット)に反映させるprisma generateはデフォルト設定だとnode_module直下のclientが更新される。
そのままではvercel等の外部ホスティングサービスにデプロイすると更新が適用されない場合があるため、本番リリース後でも正常に動作させるにはclient自体をルートフォルダ直下に作成して参照させる必要がある。
generator client {
provider = "prisma-client-js"
output = "./src/prisma/client" //outputの設定を追加してprisma clientを外部出力する
}
この設定を追加した後、デプロイ時に実行するコマンドに「prisma generate」を加えることでvercel等でも正常にDB処理が動作するようになる。
//ホスティングサービスへのデプロイ時にこのコマンドを実行するように設定する。
"vercel-build": "prisma generate && prisma migrate deploy && next build"
3.schema.prismaの分割
prismaにも弱点が一つだけある。migrateやgenerateでDB定義を設定する際に単一のschema.prismaしか参照できない事だ。
アプリで使用するDBのテーブルが1つか2つ程度であればいいが、これが大規模システムになってmodelの数が10個も20個も増えてしまうと単一のファイルに書き連ねていくのはどうしてもソースの可読性に支障が出てしまう。
幸いprisma用にschema用のファイルを結合させて一つのschema.prismaを作成するための「prisma import」というライブラリも提供されているので是非とも導入しよう。
こちらの記事に詳しく書かれている。