Prisma の開発体験をさらに良くしたい!
はじめに
マイグレーションツールは何を使っていますか?
Prisma を使ったことはあるでしょうか?
一般的には TypeScript 用の ORM として活用されていますが
私は Prisma をマイグレーションツールとして使うことがお気に入りです。
(まだ業務レベルで使ったことはありませんが ... )
開発体験が非常に良いです!
ただ、困ることが1点。
都度都度マイグレーションコマンドを実行するのがめんどくさい。
ホットリロードできないかな。
そんなことを考えて作ってみた環境の紹介となります。
Prisma Migrate
ドキュメントはこちらになります。
Prisma Migrate をインストールするために Bun を使います。
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
マイグレーションをホットリロードで
どうやって実現するか?
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 をさらに使いやすくするために仕組み化してみました。
今回実装したコードは以下に置いておきます。
そろそろ本番環境向けのマイグレーション方法についてキャッチアップして
Kubernetes の Job で実行できるようにコンテナ化しなきゃ ...
Discussion