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の場合、タイムアウトなしを意味します。
接続タイムアウトのもう1つの考えられる原因は、Prisma ORMの接続プールです。接続プールのデフォルトのタイムアウトは10秒です。これは通常Neonには十分な時間ですが、それでも接続タイムアウトが発生する場合は、(上記のconnect_timeout
設定に加えて)pool_timeout
パラメータをより高い値に設定して、この制限を増やすことができます。例:
DATABASE_URL=postgres://daniel:<password>@ep-mute-rain-952417.us-east-2.aws.neon.tech/neondb?connect_timeout=15&pool_timeout=15
NeonのサーバーレスドライバをPrisma ORMで使用する方法(プレビュー)
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アダプター、Neonサーバーレスドライバ、およびws
パッケージをインストールします。
npm install @prisma/adapter-neon @neondatabase/serverless ws
npm install --save-dev @types/ws
Prisma Clientインスタンスを更新します。
import { Pool, neonConfig } from '@neondatabase/serverless'
import { PrismaNeon } from '@prisma/adapter-neon'
import { PrismaClient } from '@prisma/client'
import dotenv from 'dotenv'
import ws from 'ws'
dotenv.config()
neonConfig.webSocketConstructor = ws
const connectionString = `${process.env.DATABASE_URL}`
const pool = new Pool({ connectionString })
const adapter = new PrismaNeon(pool)
const prisma = new PrismaClient({ adapter })
その後、通常どおりにPrisma Clientを完全な型安全性で使用できます。Prisma Migrate、イントロスペクション、およびPrisma Studioは、Prismaスキーマで定義された接続文字列を使用して、これまでどおり動作し続けます。
注記
PostgreSQLスキーマの指定
PostgreSQLスキーマは、PrismaNeon
をインスタンス化するときにschema
オプションを渡すことで指定できます。
const adapter = new PrismaNeon(pool, {
schema: 'myPostgresSchema'
})