🦙
PrismaORM TypedSQLのgenerateはDB接続が必要
こんにちはムーザルちゃんねるの@zaruです。今回はPrisma ORMが提供するTypedSQLという生SQLに型情報を付与できる強力な機能を使ったアプリのデプロイでちょっと困ったことがあったので対処法をメモしておきます。これよりいい方法がある気がしますが、一旦の回避策として。
困っていることは…一言でいうとこれです。
TypedSQLを使うとprisma generate時、DB接続が必要
PrismaではDBスキーマを元にDBクライアントの型情報などを自動生成する prisma generate
というコマンドがあります。このコマンドで生成したファイルを使ってTypeScriptでDB操作をします。つまりこのコマンドで生成したファイル群はデプロイ時には必須です。
従来は prisma generate
は実際にDBが存在しなくても実行できました。スキーマファイルを参照するだけで生成ができます。しかしTypedSQLを利用すると、SQLの型情報を作るためにDBに問い合わせが発生します。
npx prisma generate --sql # TypedSQLをサポートするには --sql オプションが必要
前提条件
- フレームワーク:Next.js
- CI:GitHub Actions
- Next.jsをDockerイメージにビルドしたい
スクリプトたち
回避法は非常に簡単で、GitHub Actionsの中でDBを立ち上げ、Dockerイメージビルド時にDB接続できるようにするだけです。要は、ローカル環境と同じ構成を作るという感じです。
GitHub Action
jobs:
build:
runs-on: ubuntu-latest
services:
mysql:
image: mysql:8
ports:
- 3306:3306
env:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: example
steps:
- uses: actions/checkout@v4
- name: Set up buildx
uses: docker/setup-buildx-action@v3
with:
# DockerfileからMySQLに接続するための設定
driver-opts: network=host
# ビルド自体は特に変わりない
- name: Build and push images
uses: docker/build-push-action@v5
with:
context: .
file: ./Dockerfile
tags: example:latest
push: true
Dockerfile
# 省略
# ここでprisma generateを実行する
RUN \
env DATABASE_URL=mysql://root:password@127.0.0.1:3306/example \
sh -c 'npx prisma db push && npx prisma generate --sql'
RUN yarn build
# 省略
検討したがやらなかったこと
Dockerビルド時にprisma generateするのではなく、あらかじめgenerateした成果物をDockerイメージに移すやり方も検討したのですが、生成されるファイル群の数が多く、場所も散らばっていたため運用をしていく中で壊れる可能性を感じました。
そのため、あまり行儀が良いやり方ではないですが、DockerfileからホストのDBを参照してgenerateできるようにしました。
Discussion