メインコンテンツまでスキップ

Prisma

このガイドでは、Supabaseが提供するPostgresデータベースを、Prismaプロジェクトに素早く接続する方法を説明します。

Prismaは、オープンソースの次世代ORMです。以下のパーツで構成されています。

  • Prisma Client:Node.jsおよびTypeScript用の、自動生成とタイプセーフなクエリビルダ
  • Prisma Migrate:マイグレーションシステム
  • Prisma Studio:データベースのデータを閲覧、編集するためのGUI

ステップ1:Supabaseプロジェクトの設定から接続文字列を取得

サイドバーからSettingsページに移動し、Databaseタブに移動します。データベースの接続文字列と、プロジェクトの作成時に入力したパスワードのプレースホルダーが表示されます。 Getting the connection string

ステップ2:接続をテスト

すべてが正しく動作していることを確認するために、接続文字列をPrismaプロジェクトで試してみましょう。

既にプロジェクトをお持ちの場合は、.envファイルのDATABASE_URLに接続文字列(パスワードを含む)を設定するだけで、すぐに使用できます。

Prismaプロジェクトを持っていない場合や、初めてPrismaを使う場合は、クイックスタートガイドのリポジトリーを使用します。

スタータープロジェクトをクローンして作成

任意のディレクトリーに移動し、Windowsマシンの場合はターミナルで以下のコマンドを実行してください。

curl https://pris.ly/quickstart -L -o quickstart-main.tar.gz && tar -zxvf quickstart-main.tar.gz quickstart-main/typescript/starter && move quickstart-main\typescript\starter starter && rmdir /S /Q quickstart-main && del /Q quickstart-main.tar.gz

また、Mac OSまたはLinuxを使用している場合は、次のコマンドを実行します。

curl -L https://pris.ly/quickstart | tar -xz --strip=2 quickstart-main/typescript/starter

それから、作成されたディレクトリーに移動して、プロジェクトの依存関係をインストールします。

cd starter && npm install

プロジェクトの構造を確認

このプロジェクトは、TypeScriptが設定されており、以下のような構造になっています。

  • prismaディレクトリーには以下が含まれます。
    • dev.dbファイル:これはSQLiteデータベースです。
    • schema.prismaファイル:さまざまなデータベースモデルとそれらの間の関係を定義します。
  • .envファイル:DATABASE_URL変数が含まれており、Prismaはこの変数を使用します。
  • script.tsファイル:Prisma Clientを使用していくつかのクエリを実行します。このスターターには、以下のパッケージがインストールされています。
  • @prisma/client:あたなのデータに合わせて、タイプセーフなクエリを自動生成するビルダ。
  • prisma:Prismaのコマンドラインインターフェイス(CLI)です。新しいプロジェクトの初期化やPrismaクライアントを生成できます。また、Introspectionによる既存のデータベース構造を分析し、アプリケーションのモデルを自動的に作成できます。

    注:Prismaは、JavaScriptとTypeScriptの両方で動作します。しかし、最高の開発体験を得るためには、TypeScriptの使用を強く推奨します。

PostgreSQLを使用するためのプロジェクトの設定

次に、prisma/.envファイルの中で、DATABASE_URL変数の値を、ステップ3で取得した接続文字列に更新します。URLは以下のようになります。

# prisma/.env
postgres://postgres:[YOUR-PASSWORD]@db.vdbnhqozmlzdsaejdxwr.supabase.co:5432/postgres

最後に、schema.prismaファイルの中で、providerを「sqlite」からpostgresqlに変更します。 schema.prismaファイルは次のようになります。

datasource db {
provider = “postgresql”
url = env(“DATABASE_URL”)
}
generator client {
provider = “prisma-client-js”
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}

すべてが正しく動作することをテストするために、以下のコマンドを実行してマイグレーションを作成します。

prisma migrate dev --name init

任意で、どのような変更をしたか、マイグレーションに名前を付けることができます。これはプロジェクトの最初のマイグレーションなので、--nameフラグに「init」を設定しています。すべてが正しく動作すると、ターミナルに次のようなメッセージが表示されます。

Your database is now in sync with your schema.
:heavy_check_mark: Generated Prisma Client (2.x.x) to ./node_modules/@prisma/client in 111ms

これにより、prismaディレクトリー内にprisma/migrationsフォルダーが作成され、Prismaのスキーマとデータベースのスキーマが同期されます。

メモ:マイグレーションの履歴作成のプロセスをスキップしたい場合は、migrate devの代わりにdb pushコマンドを使用することができます。 Supabaseプロジェクトに移動し、テーブルエディタで、PostUserの2つのテーブルが作成されていることを確認してください。 tables created in the UI 以上で完了です。Supabase上にホストされたPostgreSQLデータベースにPrismaプロジェクトを接続し、最初のマイグレーションを実行することができました。

リアルタイム機能の確認

PostgreSQLにおいてダブル・クオテーションで囲むと、PrismaがEnum型を作成してしまう既知の問題があります。これは、カラムがEnum型に依存しているRealtimeが有効になったデータベースのテーブルと互換性がありません。現在修正していますが(このGitHub issueで状況を確認できます)、Enum型の名前を変更することで回避できます。以下のクエリで、publicスキーマにあるダブル・クォーテーションを含む全ての型を見つけることができます。

select distinct(a.atttypid::regtype)
from pg_class as c
join pg_namespace as n
on c.relnamespace = n.oid
join pg_attribute as a
on c.oid = a.attrelid
where nspname = 'public'
and a.atttypid::regtype::text like '"%"';

次に、例として次のクエリを実行して、ダブル・クオーテーション・マークを削除します。

alter type "Incompatible" rename to compatible;

Supabaseでのコネクションプーリング

サーバーレス環境(AWS Lambda、Vercel、Netlify FunctionsにホストされているNode.js関数など)で作業している場合は、コネクションプーリングを設定する必要があります。例えば、PgBouncerのようなツールがあります。それは、関数を呼びだすたびに、データベースへの新しい接続を発生させる可能性があるからです。Supabaseは、PgBouncerを使用して接続管理をサポートしており、デフォルトで有効になっています。 SupabaseダッシュボードのサイドバーからDatabaseページに移動し、connection pool設定に移動してください。 Connection pool settings マイグレーションを実行する際には、プールされていない接続URL(ステップ4で使用したようなもの)を使用する必要があります。また、PostgreSQLの接続URLに?pgbouncer=trueフラグを追加します。URLは以下のようになります。同時接続数を最小限にするため、connection_limit1に設定することも推奨されます。そのため、URLは以下のようになります。

# prisma/.env
postgres://postgres:[YOUR-PASSWORD]@db.vdbnhqozmlzdsaejdxwr.supabase.co:6543/postgres?pgbouncer=true&connection_limit=1

Prisma Migrateは、データベース・トランザクションを使用して、データベースとマイグレーション・テーブルの現在の状態をチェックします。しかし、マイグレーションのエンジンはデータベースへの単一の接続を使用するように設計されており、PgBouncerによるコネクションプーリングをサポートしていません。コネクションプーリングにPgBouncerを使用している環境でPrisma Migrateコマンドを実行しようとすると、次のようなエラーを表示することがあります。

Error: undefined: Database error
Error querying the database: db error: ERROR: prepared statement “s0” already exists

これは既知の問題であり、現在作業中です。このGitHub issueで進捗状況を確認できます。 Prismaについてさらに詳しく知りたい場合は、ドキュメントをご覧ください。また、質問や問題が発生した場合は、リポジトリーのディスカッションセクションで気軽にディスカッションを始めてください。

リソース