メインコンテンツへスキップ

Neon

このガイドでは、以下の方法を説明します。

Neonとは?

Neonは、無料枠が充実したフルマネージドのサーバーレスPostgreSQLです。Neonはストレージとコンピューティングを分離し、サーバーレス、ブランチング、ボトムレスストレージなどの最新の開発者機能を提供します。Neonはオープンソースであり、Rustで書かれています。

Neonの詳細についてはこちらをご覧ください。

他のデータベースプロバイダーとの共通点

NeonでPrisma ORMを使用する際の多くの側面は、他のPostgreSQLデータベースでPrisma ORMを使用するのと同様です。以下のことができます。

考慮すべき違い

NeonとPostgreSQLにはいくつかの違いがあり、Prisma ORMでNeonを使用することを決定する際には、以下の点に注意する必要があります。

  • Neonのサーバーレスモデル — デフォルトでは、Neonは5分間アクティビティがないとコンピューティングをゼロにスケールします。この状態の間、コンピューティングインスタンスはアイドル状態になります。この機能の特性は、「コールドスタート」という概念です。アイドル状態からコンピューティングをアクティブにするには、500ミリ秒から数秒かかります。データベースへの接続にかかる時間によっては、アプリケーションがタイムアウトする可能性があります。詳細については、以下を参照してください。接続遅延とタイムアウト
  • Neonの接続プーラー — NeonはPgBouncerを使用して接続プールを提供し、最大10,000の同時接続を可能にします。詳細については、以下を参照してください。接続プール

Neonの接続プールを使用する方法

Neonで利用可能な接続プールを使用する場合、Prismaスキーマのdatasourceブロックのurlプロパティで使用されるDATABASE_URL環境変数のホスト名に-poolerを追加する必要があります。

.env
# 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なし)を使用します。

.env
# 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を使用できます。

schema.prisma
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' })
© . All rights reserved.