Atlasは、CI/CD、スキーマ監視、バージョン管理などの高度なデータベーススキーマ管理ワークフローを可能にする強力なマイグレーションツールです。Prisma ORMとAtlasを組み合わせて、Atlasの低レベルデータベース機能を利用する方法を学びましょう。
はじめに
Atlasは、CI/CD連携、スキーマ監視、バージョン管理などの高度なデータベーススキーマ管理ワークフローを可能にする、強力なデータモデリングおよびマイグレーションツールです。
このガイドでは、既存のPrisma ORMプロジェクトのPrisma MigrateをAtlasに置き換えることで、Atlasの高度なスキーマ管理およびマイグレーションワークフローを活用する方法を学びます。
そうすることで、Prisma ORMの直感的なデータモデルと型安全なクエリ機能を使いつつ、Atlasが提供する強化されたマイグレーション機能を活用できます。
このチュートリアルの例のリポジトリはGitHubで見つけることができます。このリポジトリには、本ガイドの各ステップに対応するブランチがあります。
Prisma Migrateの代わりにAtlasを使用する理由
Prisma Migrateは、アプリケーション開発者がデータベーススキーマを管理する上でほとんどのユースケースをカバーする強力なマイグレーションツールです。開発から本番への移行や、チームコラボレーションを念頭に置いたワークフローを提供します。
しかし、さらに多くの機能が必要な場合、以下のシナリオでAtlasのような専用ツールを使用してマイグレーションワークフローを強化することができます。
- 継続的インテグレーション (CI): Atlasを使用すると、堅牢なGitHub Actions、GitLab、およびCircleCI Orbsとの連携により、本番環境に到達する前に問題を特定できます。また、リスクの高いマイグレーションの検出、データマイグレーションのテスト、データベース関数のテストなども可能です。
- 継続的デリバリー (CD): Atlasはパイプラインに統合でき、デプロイメント機構 (例: Kubernetes Operator、Terraformなど) とのネイティブな連携を提供します。
- スキーマ監視: Atlasはデータベーススキーマを監視し、予期せぬ状態から逸脱した場合に警告を発することができます。
- 低レベルデータベース機能のサポート: ビュー、ストアドプロシージャ、トリガー、行レベルセキュリティなどの高度なデータベースオブジェクトの自動マイグレーション計画。
前提条件
このガイドを正常に完了するには、以下が必要です。
- 既存のPrisma ORMプロジェクト(
prisma
および@prisma/client
パッケージがインストールされていること) - PostgreSQLデータベースとその接続文字列
- マシンにDockerがインストールされていること(Atlasの一時的な開発データベースを管理するため)
このガイドの目的のために、Prismaスキーマに、当社のドキュメント全体で主要な例として使用している標準的なUser
およびPost
モデルが含まれていると仮定します。Prisma ORMプロジェクトをお持ちでない場合は、orm/script
の例を使用してこのガイドを進めることができます。
このステップの開始点は、例のリポジトリのstart
ブランチです。
ステップ1: 既存のPrisma ORMプロジェクトにAtlasを追加する
このチュートリアルを開始するには、まずAtlas CLIをインストールします。
別のインストール方法(DockerやHomebrewなど)をご希望の場合は、こちらで見つけることができます。
次に、Prisma ORMを使用しているプロジェクトのルートディレクトリに移動し、atlas.hcl
という名前のメインのAtlasスキーマファイルを作成します。
次に、以下のコードを追加します。
Atlasスキーマファイルの構文ハイライトやその他の便利な機能を利用するには、Atlas VS Code拡張機能をインストールしてください。
上記のスニペットでは、2つのことを行っています。
data
ブロックを使用してprisma
というexternal_schema
を定義します。Atlasは様々なソースからデータベーススキーマ定義を統合できます。このケースでは、program
フィールドで指定されているprisma migrate diff
コマンドによって生成されるSQLがソースとなります。env
ブロックを使用して、環境(local
という名前)の詳細を指定します。dev
: シャドウデータベース(Atlasでは開発データベースと呼ばれます)を指します。Prisma Migrateと同様に、Atlasもマイグレーションの「ドライラン」にシャドウデータベースを使用します。ここで提供する接続は、PrismaスキーマのshadowDatabaseUrl
に似ています。ただし、このケースでは、一時的なデータベースインスタンスを管理するためにDockerを使用しています。schema
: Prisma ORMがターゲットとするデータベースのデータベース接続URLを指します(ほとんどの場合、これはDATABASE_URL
環境変数と同じになります)。migration
: Atlasマイグレーションファイルを保存したいファイルシステムのディレクトリを指します(prisma/migrations
フォルダーに似ています)。_prisma_migrations
がAtlasのマイグレーション履歴で追跡されないように除外している点に注意してください。
シャドウデータベースに加えて、AtlasのマイグレーションシステムとPrisma Migrateにはもう1つの共通点があります。どちらもデータベース内の専用テーブルを使用して、適用されたマイグレーションの履歴を追跡します。Prisma Migrateでは、このテーブルは_prisma_migrations
と呼ばれます。Atlasでは、atlas_schema_revisions
と呼ばれます。
Atlasに、データベースの現在の状態(既存のすべてのテーブルやその他のデータベースオブジェクトを含む)が、プロジェクトでマイグレーションを追跡するための開始点となることを伝えるために、最初のベースラインマイグレーションを行う必要があります。
そのためには、まず以下のコマンドを実行してAtlasのマイグレーションディレクトリを作成します。
このコマンドは、
local
環境の現在の状態を確認し、Atlasスキーマで定義されたexternal_schema
に基づいてSQLマイグレーションファイルを生成します。atlas/migrations
フォルダーを作成し、そこにSQLマイグレーションを配置します。
実行後、フォルダー構造は以下のようになります。
この時点では、Atlasはまだデータベースに対して何も行っていません。ローカルマシン上にファイルを作成しただけです。
次に、生成されたマイグレーションを適用して、これがAtlasのマイグレーション履歴の開始点となることをAtlasに伝える必要があります。そのためには、atlas migrate apply
コマンドを実行しますが、今回は--baseline __TIMESTAMP__
オプションを付けてください。
Atlasがatlas/migrations
内に作成したファイル名からタイムスタンプをコピーし、次のスニペットの__TIMESTAMP__
プレースホルダー値を置き換えます。同様に、__DATABASE_URL__
プレースホルダーをデータベース接続文字列に置き換えます。
生成されたマイグレーションファイルが20241210094213.sql
という名前で、データベースがpostgresql://johndoe:mypassword42@localhost:5432/example-db?search_path=public&sslmode=disable
で実行されていると仮定すると、コマンドは以下のようになります。
コマンドの出力は以下のようになります。
今、データベースを調べると、atlas_schema_revisions
テーブルが作成されており、Atlasマイグレーション履歴の開始を指定する2つのエントリが含まれていることがわかります。
プロジェクトは、例のリポジトリの
step-1
ブランチに似た状態になっているはずです。
ステップ2: Atlasでマイグレーションを実行する
次に、Prismaスキーマを編集し、Atlasマイグレーションを使用してデータベースに変更を反映する方法を学びます。大まかには、プロセスは以下のようになります。
- Prismaスキーマに変更を加える
atlas migrate diff
を実行してマイグレーションファイルを作成するatlas migrate apply
を実行して、データベースに対してマイグレーションファイルを実行するprisma generate
を実行してPrisma Clientを更新する- Prisma Clientを介してアプリケーションコードで変更されたスキーマにアクセスする
このチュートリアルの目的のために、Post
モデルとの多対多リレーションを持つTag
モデルでPrismaスキーマを拡張します。
その変更が完了したら、次にマイグレーションファイルをマシン上に作成するコマンドを実行します。
以前と同様に、これによりatlas/migrations
フォルダー内に新しいファイル(例: 20241210132739.sql
)が作成され、データモデルの変更を反映するSQLコードが含まれます。上記の変更の場合、以下のようになります。
次に、以前と同じatlas migrate apply
コマンドでマイグレーションを適用できますが、今回は--baseline
オプションは不要です(__DATABASE_URL__
プレースホルダーを置き換えるのを忘れないでください)。
データベーススキーマは更新されましたが、node_modules/@prisma/client
内の生成されたPrisma Clientはまだスキーマ変更を認識していません。そのため、Prisma CLIを使用して再生成する必要があります。
これで、アプリケーションコードに移動し、更新されたスキーマに対してクエリを実行できます。このケースでは、新しいTag
モデルを含むクエリ、例えば以下のようになります。
プロジェクトは、例のリポジトリの
step-2
ブランチに似た状態になっているはずです。
ステップ3: DBスキーマに部分インデックスを追加する
このセクションでは、Prismaスキーマでサポートされていない機能でデータベーススキーマを拡張する方法を学びます。例として、部分インデックスを使用します。
これを実現するためのワークフローは以下のとおりです。
atlas
ディレクトリ内に、希望する変更を反映するSQLファイルを作成する- AtlasがそのSQLファイルを認識するように、
atlas.hcl
を更新して含める atlas migrate diff
を実行してマイグレーションファイルを作成するatlas migrate apply
を実行して、データベースに対してマイグレーションファイルを実行する
今回は、Prismaスキーマファイルを手動で編集しなかったため、Prisma Clientを再生成する必要はありません。
部分インデックスを追加しましょう!
まず、atlas
ディレクトリ内にpublished_posts_index.sql
という名前のファイルを作成します。
次に、以下のコードを追加します。
これは、published
フィールドがtrue
に設定されているPost
レコードにインデックスを作成します。このクエリは、これらの公開された投稿をクエリする場合に役立ちます。例えば、以下のようになります。
次に、スキーマの新しいSQLスニペットを認識させるためにatlas.hcl
ファイルを調整する必要があります。これはcomposite_schema
アプローチを使用することで行うことができます。atlas.hcl
ファイルを以下のように調整してください。
composite_schema
はAtlas Proプランでのみ利用可能であり、atlas login
を介した認証が必要です。
これでAtlasはスキーマ変更を認識したため、以前と同様にマイグレーションファイルを生成できます。
atlas/migrations
ディレクトリ内に再び新しいファイルが表示されます。以前と同じコマンドでマイグレーションを実行してください(__DATABASE_URL__
をご自身の接続文字列に置き換えてください)。
おめでとうございます!データベースに部分インデックスが追加され、公開された投稿のクエリがより高速になります。
プロジェクトは、例のリポジトリの
step-3
ブランチに似た状態になっているはずです。
まとめ
このチュートリアルでは、Atlasを既存のPrisma ORMプロジェクトに統合する方法を学びました。Atlasは、Prisma ORMを使用する際のスキーマ管理およびマイグレーションワークフローを強化するために使用できます。
このチュートリアルの最終結果をざっと確認したい場合は、例のリポジトリをご覧ください。
次の投稿をお見逃しなく!
Prismaニュースレターに登録する