Neon
このガイドでは、以下の方法を説明します。
Neonとは?
Neonは、無料枠が充実したフルマネージドのサーバーレスPostgreSQLです。Neonはストレージとコンピューティングを分離し、サーバーレス、ブランチング、ボトムレスストレージなどの最新の開発者機能を提供します。Neonはオープンソースであり、Rustで書かれています。
Neonの詳細についてはこちらをご覧ください。
他のデータベースプロバイダーとの共通点
NeonでPrisma ORMを使用する際の多くの側面は、他のPostgreSQLデータベースでPrisma ORMを使用するのと同様です。以下のことができます。
- Prismaスキーマ言語でデータベースをモデリングする
- スキーマでPrisma ORMの
postgresql
データベースコネクタを、そしてNeonが提供する接続文字列を使用する - Neonにすでにデータベーススキーマがある場合、既存のプロジェクトにイントロスペクションを使用する
prisma migrate dev
を使用して、Neonデータベースのスキーママイグレーションを追跡するprisma db push
を使用して、スキーマの変更をNeonにプッシュする- アプリケーションでPrisma Clientを使用して、Neonがホストするデータベースと通信する
考慮すべき違い
NeonとPostgreSQLにはいくつかの違いがあり、Prisma ORMでNeonを使用することを決定する際には、以下の点に注意する必要があります。
- Neonのサーバーレスモデル — デフォルトでは、Neonは5分間アクティビティがないとコンピューティングをゼロにスケールします。この状態の間、コンピューティングインスタンスはアイドル状態になります。この機能の特性は、「コールドスタート」という概念です。アイドル状態からコンピューティングをアクティブにするには、500ミリ秒から数秒かかります。データベースへの接続にかかる時間によっては、アプリケーションがタイムアウトする可能性があります。詳細については、以下を参照してください。接続遅延とタイムアウト。
- Neonの接続プーラー — NeonはPgBouncerを使用して接続プールを提供し、最大10,000の同時接続を可能にします。詳細については、以下を参照してください。接続プール。
Neonの接続プールを使用する方法
Neonで利用可能な接続プールを使用する場合、Prismaスキーマのdatasource
ブロックのurl
プロパティで使用されるDATABASE_URL
環境変数のホスト名に-pooler
を追加する必要があります。
# Connect to Neon with Pooling.
DATABASE_URL=postgres://daniel:<password>@ep-mute-rain-952417-pooler.us-east-2.aws.neon.tech:5432/neondb?sslmode=require
データベースに対して他のアクション(例:マイグレーション)を実行するためにPrisma CLIを使用したい場合、Prismaスキーマのdatasource
ブロックのdirectUrl
プロパティで使用するDIRECT_URL
環境変数を追加する必要があります。これにより、CLIは直接接続文字列(PgBouncerなし)を使用します。
# Connect to Neon with Pooling.
DATABASE_URL=postgres://daniel:<password>@ep-mute-rain-952417-pooler.us-east-2.aws.neon.tech/neondb?sslmode=require
# Direct connection to the database used by Prisma CLI for e.g. migrations.
DIRECT_URL="postgres://daniel:<password>@ep-mute-rain-952417.us-east-2.aws.neon.tech/neondb"
その後、schema.prisma
を更新して新しい直接URLを使用できます。
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directUrl = env("DIRECT_URL")
}
directUrl
フィールドに関する詳細情報はこちらで確認できます。
DATABASE_URL
環境変数には、プールされた接続文字列を使用することを強くお勧めします。これにより、デプロイ戦略に関係なく接続をプールできるだけでなく、Prisma CLIの優れた開発者体験も得られます。これはすべてのアプリで厳密に必要ではありませんが、サーバーレスソリューションでは接続プールが不可欠になります。
接続タイムアウトの解決
Prisma ORMからNeonに接続する際に発生する接続タイムアウトは、以下のようなエラーを引き起こします。
Error: P1001: Can't reach database server at `ep-white-thunder-826300.us-east-2.aws.neon.tech`:`5432`
Please make sure your database server is running at `ep-white-thunder-826300.us-east-2.aws.neon.tech`:`5432`.
このエラーは、Prisma Clientによって作成された接続が、Neonのコンピューティングがアクティブになる前にタイムアウトしたことを意味する可能性が高いです。
Neonのコンピューティングには、主に2つの状態があります。アクティブとアイドルです。アクティブとは、コンピューティングが現在実行中であることを意味します。5分間クエリのアクティビティがない場合、Neonはデフォルトでコンピューティングをアイドル状態にします。詳細については、Neonのドキュメントを参照してください。
Prisma ORMからアイドル状態のコンピューティングに接続すると、Neonは自動的にそれをアクティブ化します。アクティブ化は通常数秒以内に発生しますが、レイテンシが追加されると接続タイムアウトが発生する可能性があります。この問題を解決するには、connect_timeout
パラメータを追加してNeonの接続文字列を調整できます。このパラメータは、新しい接続が開かれるのを待つ最大秒数を定義します。デフォルト値は5秒です。より高い設定は、接続タイムアウトの問題を回避するために必要な時間を提供するはずです。例:
DATABASE_URL=postgres://daniel:<password>@ep-mute-rain-952417.us-east-2.aws.neon.tech/neondb?connect_timeout=10
connect_timeout
を0に設定すると、タイムアウトなしを意味します。
接続タイムアウトのもう一つの原因として、Prisma ORMの接続プールが挙げられます。これはデフォルトで10秒のタイムアウトを持っています。これは通常Neonには十分な時間ですが、それでも接続タイムアウトが発生する場合は、pool_timeout
パラメータをより高い値に設定することで、この制限を増やすことができます(上記のconnect_timeout
設定に加えて)。例:
DATABASE_URL=postgres://daniel:<password>@ep-mute-rain-952417.us-east-2.aws.neon.tech/neondb?connect_timeout=15&pool_timeout=15
Prisma ORMでNeonのサーバーレスドライバを使用する方法(プレビュー)
Neonサーバーレスドライバは、JavaScriptおよびTypeScript向けの低レイテンシPostgresドライバであり、TCPの代わりにHTTPまたはWebSocketを介してサーバーレスおよびエッジ環境からデータをクエリできます。
Prisma ORMは、ドライバアダプタを使用してNeonサーバーレスドライバと連携させることができます。ドライバアダプタを使用すると、Prisma ORMが提供するデフォルトのデータベースドライバとは異なるドライバを使用してデータベースと通信できます。
この機能は、Prisma ORMバージョン5.4.2以降でプレビュー版として利用可能です。
開始するには、driverAdapters
プレビュー機能フラグを有効にします。
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
Prisma Clientを生成する
npx prisma generate
Neon用のPrisma ORMアダプタをインストールする
npm install @prisma/adapter-neon
Prisma Clientインスタンスを更新する
import { PrismaClient } from '@prisma/client'
import { PrismaNeon } from '@prisma/adapter-neon'
import dotenv from 'dotenv'
dotenv.config()
const connectionString = `${process.env.DATABASE_URL}`
const adapter = new PrismaNeon({ connectionString })
const prisma = new PrismaClient({ adapter })
その後、完全な型安全性で通常通りPrisma Clientを使用できます。Prisma Migrate、イントロスペクション、Prisma Studioは、Prismaスキーマで定義された接続文字列を使用して、以前と同様に機能し続けます。
備考
PostgreSQLスキーマの指定
PrismaNeon
をインスタンス化する際に、schema
オプションを渡すことで、PostgreSQLスキーマを指定できます。
const adapter = new PrismaNeon(
{ connectionString },
{ schema: 'myPostgresSchema' })