🔼

Prisma の開発体験をさらに良くしたい!

2024/03/20に公開

はじめに

マイグレーションツールは何を使っていますか?

https://www.prisma.io/

Prisma を使ったことはあるでしょうか?
一般的には TypeScript 用の ORM として活用されていますが
私は Prisma をマイグレーションツールとして使うことがお気に入りです。
(まだ業務レベルで使ったことはありませんが ... )
開発体験が非常に良いです!

ただ、困ることが1点。
都度都度マイグレーションコマンドを実行するのがめんどくさい。
ホットリロードできないかな。
そんなことを考えて作ってみた環境の紹介となります。

Prisma Migrate

ドキュメントはこちらになります。

https://www.prisma.io/docs/orm/prisma-migrate

Prisma Migrate をインストールするために Bun を使います。

https://bun.sh/

Bun は以下のコマンドでインストールできます。

curl -fsSL https://bun.sh/install | bash

そして以下のコマンドで Prisma をインストールします。

bun install prisma
bun --version
1.0.33
bun run prisma --version
prisma                  : 5.11.0
@prisma/client          : Not found
Computed binaryTarget   : darwin-arm64
Operating System        : darwin
Architecture            : arm64
Node.js                 : v18.17.0
Query Engine (Node-API) : libquery-engine efd2449663b3d73d637ea1fd226bafbcf45b3102 (at node_modules/@prisma/engines/libquery_engine-darwin-arm64.dylib.node)
Schema Engine           : schema-engine-cli efd2449663b3d73d637ea1fd226bafbcf45b3102 (at node_modules/@prisma/engines/schema-engine-darwin-arm64)
Schema Wasm             : @prisma/prisma-schema-wasm 5.11.0-15.efd2449663b3d73d637ea1fd226bafbcf45b3102
Default Engines Hash    : efd2449663b3d73d637ea1fd226bafbcf45b3102
Studio                  : 0.499.0

マイグレーションをホットリロードで

どうやって実現するか?

https://github.com/inotify-tools/inotify-tools

inotify-tools というツールを使って Prisma の schema.prisma を監視対象にして prisma db push を実行するだけです!

以下の Dockerfile を用意し compose.yaml にて参照します。

※ 説明の都合上省略していますが Docker にて PostgreSQL 環境も用意しています。

FROM node:lts-slim
 
ENV BUN_INSTALL $HOME/.bun

ENV PATH $BUN_INSTALL/bin:$PATH

RUN apt-get update && apt-get install -y inotify-tools curl unzip

RUN curl -fsSL https://bun.sh/install | bash && \
    bun install prisma
services:
  prisma:
    container_name: prisma
    build:
      context: .
      dockerfile: prisma/Dockerfile
    ports:
      - 5555:5555
    environment:
      DATABASE_URL: postgres://postgres:postgres@postgres:5432/postgres?sslmode=disable
    working_dir: /schema
    volumes:
      - ../schema:/schema
    restart: always
    depends_on:
      - postgres
    command: ["bash", "local.sh"]

Dockerfile のエントリポイントとして以下のスクリプトを用意します。

#!/bin/bash

sleep 5

bun run prisma db push

bun run prisma studio &

while true; do
  inotifywait -e modify /schema/prisma/schema.prisma
  bun run prisma format
  bun run prisma db push
done

Docker が起動すると下記のようなログが出力されます。

Prisma schema loaded from prisma/schema.prisma
Datasource "db": PostgreSQL database "postgres", schema "public" at "postgres:5432"

🚀  Your database is now in sync with your Prisma schema. Done in 95ms

Setting up watches.
Watches established.
Prisma schema loaded from prisma/schema.prisma
Prisma Studio is up on http://localhost:5555

これにてめでたく schema.prisma に更新があるたびにマイグレーションが実行されるようになりました!

※ Bun に Watch mode がありますがこれではホットリロードの実現はできませんでした。

おわりに

開発体験が良い Prisma をさらに使いやすくするために仕組み化してみました。

今回実装したコードは以下に置いておきます。

https://github.com/otakakot/enhancement-prisma-dx

そろそろ本番環境向けのマイグレーション方法についてキャッチアップして
Kubernetes の Job で実行できるようにコンテナ化しなきゃ ...

Discussion