Neon
本指南解释了如何
什么是 Neon?
Neon 是一个完全托管的 serverless PostgreSQL,提供慷慨的免费套餐。Neon 分离存储和计算,并提供诸如 serverless、分支、无限存储等现代化的开发者功能。Neon 是开源的,用 Rust 编写。
在这里了解更多关于 Neon 的信息 这里。
与其他数据库提供商的共性
在 Neon 中使用 Prisma ORM 的许多方面与其他 PostgreSQL 数据库的使用方式类似。你可以
- 使用 Prisma Schema Language 为数据库建模
- 在你的 schema 中使用 Prisma ORM 的
postgresql
数据库连接器,以及 Neon 提供的连接字符串 - 如果你的 Neon 上已经有数据库 schema,可以为现有项目使用 Introspection
- 使用
prisma migrate dev
跟踪你在 Neon 数据库中的 schema 迁移 - 使用
prisma db push
将 schema 中的更改推送到 Neon - 在你的应用程序中使用 Prisma Client 与 Neon 托管的数据库通信
需要考虑的区别
Neon 和 PostgreSQL 之间有一些区别,在使用 Prisma ORM 结合 Neon 时,你应该了解以下几点
- Neon 的 serverless 模型 — 默认情况下,Neon 会在 5 分钟不活动后将计算资源缩减到零。在此状态下,计算实例处于空闲状态。此功能的一个特点是“冷启动”概念。从空闲状态激活计算资源需要 500ms 到几秒钟。根据连接到数据库所需的时间,你的应用程序可能会超时。要了解更多信息,请参阅:连接延迟与超时。
- 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 出色的开发者体验,同时无论部署策略如何,都能允许连接池化。虽然并非每个应用程序都严格需要这样做,但 serverless 解决方案将不可避免地需要连接池化。
解决连接超时问题
当从 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 计算资源有两个主要状态:Active(活动)和 Idle(空闲)。Active 表示计算资源当前正在运行。如果 5 分钟内没有查询活动,Neon 默认会将计算资源置于 idle 状态。请参阅 Neon 的文档了解更多信息。
当您从 Prisma ORM 连接到处于 idle 状态的计算资源时,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 的 serverless 驱动程序与 Prisma ORM 结合使用(预览)
Neon serverless 驱动程序 是一个用于 JavaScript 和 TypeScript 的低延迟 Postgres 驱动程序,它允许您在 serverless 和边缘环境中通过 HTTP 或 WebSockets 查询数据,而不是 TCP。
您可以结合使用 Prisma ORM 和 Neon serverless 驱动程序,通过一个 驱动程序适配器 。驱动程序适配器允许您使用 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
安装 Prisma ORM 的 Neon 适配器
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、introspection 和 Prisma Studio 将继续像以前一样工作,使用 Prisma schema 中定义的连接字符串。
注意事项
指定 PostgreSQL schema
你可以通过在实例化 PrismaNeon
时传入 schema
选项来指定一个 PostgreSQL schema
const adapter = new PrismaNeon(
{ connectionString },
{ schema: 'myPostgresSchema' })