Neon
本指南解釋瞭如何
什麼是 Neon?
Neon 是一個功能齊全的無伺服器 PostgreSQL,提供慷慨的免費套餐。Neon 分離了儲存和計算,並提供了現代化的開發者功能,如無伺服器、分支、無限儲存等。Neon 是開源的,並使用 Rust 編寫。
在此瞭解更多關於 Neon 的資訊 此處。
與其他資料庫提供商的共同點
將 Prisma ORM 與 Neon 結合使用的許多方面,與將 Prisma ORM 與任何其他 PostgreSQL 資料庫結合使用一樣。您可以
- 使用 Prisma Schema Language 建模您的資料庫
- 在您的 schema 中使用 Prisma ORM 的
postgresql資料庫聯結器,以及 Neon 為您提供的連線字串 - 如果您已經在 Neon 上擁有資料庫 schema,則可為現有專案使用 內省
- 使用
prisma migrate dev來跟蹤 Neon 資料庫中的 schema 遷移 - 使用
prisma db push將您的 schema 更改推送到 Neon - 在您的應用程式中使用 Prisma Client 與 Neon 託管的資料庫進行通訊
需要考慮的差異
在決定將 Neon 與 Prisma ORM 結合使用時,您應該注意 Neon 和 PostgreSQL 之間的一些差異
- Neon 的無伺服器模型 — 預設情況下,Neon 會在 5 分鐘不活動後將 計算例項 縮放到零。在此狀態下,計算例項處於空閒狀態。此功能的一個特點是“冷啟動”的概念。從空閒狀態啟用計算例項需要 500 毫秒到幾秒鐘。根據連線到資料庫所需的時間,您的應用程式可能會超時。欲瞭解更多資訊,請參閱:連線延遲和超時。
- Neon 的連線池器 — Neon 使用 PgBouncer 提供連線池,支援多達 10,000 個併發連線。欲瞭解更多資訊,請參閱:連線池。
如何使用 Neon 的連線池
如果您希望使用 Neon 中可用的 連線池,您需要在 Prisma schema 的 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 對資料庫執行其他操作(例如用於遷移),您將需要新增一個 DIRECT_URL 環境變數,並在 Prisma schema 的 datasource 塊的 directUrl 屬性中使用,以便 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 計算例項有兩種主要狀態:活躍和空閒。活躍表示計算例項正在執行。如果 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
如何將 Neon 的無伺服器驅動程式與 Prisma ORM 結合使用(預覽版)
Neon 無伺服器驅動程式 是一款低延遲的 Postgres 驅動程式,適用於 JavaScript 和 TypeScript,允許您透過 HTTP 或 WebSockets 而非 TCP 從無伺服器和邊緣環境中查詢資料。
您可以將 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 schema 中定義的連線字串。
備註
指定 PostgreSQL schema
您可以在例項化 PrismaNeon 時,透過傳入 schema 選項來指定一個 PostgreSQL schema
const adapter = new PrismaNeon(
{ connectionString },
{ schema: 'myPostgresSchema' })