Neon
本指南介绍如何
什么是 Neon?
Neon 是一个完全托管的无服务器 PostgreSQL,拥有慷慨的免费层。Neon 将存储和计算分开,并提供现代开发人员功能,例如无服务器、分支、无限存储等等。Neon 是开源的,并用 Rust 编写。
了解更多关于 Neon 的信息,点击此处.
与其他数据库提供商的共同点
将 Prisma ORM 与 Neon 结合使用,其许多方面与使用 Prisma ORM 与任何其他 PostgreSQL 数据库相同。你可以
- 使用 Prisma 模式语言 对数据库进行建模
- 在你的模式中使用 Prisma ORM 的
postgresql
数据库连接器,以及 Neon 提供的连接字符串 - 对于现有项目,如果已经在 Neon 上拥有数据库模式,则可以使用 内省
- 使用
prisma migrate dev
在 Neon 数据库中跟踪模式迁移 - 使用
prisma db push
将模式中的更改推送到 Neon - 在你的应用程序中使用 Prisma 客户端 与 Neon 托管的数据库进行通信
需要考虑的差异
在决定将 Neon 与 Prisma ORM 结合使用时,你需要了解 Neon 和 PostgreSQL 之间的一些差异
- 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 在你的数据库上执行其他操作(例如迁移),你需要添加一个 DIRECT_URL
环境变量,以便在 Prisma 模式的 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 客户端创建的连接在 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 无服务器驱动程序 是一个针对 JavaScript 和 TypeScript 的低延迟 Postgres 驱动程序,它允许你从无服务器和边缘环境通过 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 客户端
npx prisma generate
安装 Neon 的 Prisma ORM 适配器、Neon 无服务器驱动程序和 ws
包
npm install @prisma/adapter-neon @neondatabase/serverless ws
npm install --save-dev @types/ws
更新你的 Prisma 客户端实例
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 客户端,并拥有完整的类型安全。Prisma Migrate、内省和 Prisma Studio 将继续像以前一样工作,使用 Prisma 模式中定义的连接字符串。
备注
指定 PostgreSQL 模式
您可以在实例化 PrismaNeon
时通过传递 schema
选项来指定一个 PostgreSQL 模式
const adapter = new PrismaNeon(pool, {
schema: 'myPostgresSchema'
})