🦙

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