跳至主要内容

Neon

本指南解释如何

什么是 Neon?

Neon 是一个完全托管的无服务器 PostgreSQL,提供慷慨的免费套餐。Neon 将存储和计算分离,并提供现代开发人员功能,例如无服务器、分支、无限存储等。Neon 是开源的,用 Rust 编写。

在此处了解有关 Neon 的更多信息:此处

与其他数据库提供商的共同点

使用 Prisma ORM 与 Neon 的许多方面都与使用 Prisma ORM 与任何其他 PostgreSQL 数据库类似。您可以

需要考虑的差异

当您决定将 Neon 与 Prisma ORM 结合使用时,Neon 和 PostgreSQL 之间有一些您应该注意的差异

  • Neon 的无服务器模型 — 默认情况下,Neon 会在 5 分钟不活动后将 计算实例 扩展到零。在此状态下,计算实例处于空闲状态。此功能的一个特点是“冷启动”概念。从空闲状态激活计算需要 500 毫秒到几秒钟。根据连接到数据库所需的时间,您的应用程序可能会超时。要了解更多信息,请参阅:连接延迟和超时
  • Neon 的连接池 — Neon 提供使用 PgBouncer 的连接池,支持多达 10,000 个并发连接。要了解更多信息,请参阅:连接池

如何使用 Neon 的连接池

如果您想使用 Neon 中提供的 连接池,您需要在 Prisma Client 通过驱动程序适配器使用的连接字符串的主机名中添加 -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 migrateprisma db pull)现在从 prisma.config.ts 读取直接连接字符串。配置一个池化和非池化环境变量

.env
# Connect to Neon with pooling (used by Prisma Client via the adapter).
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 the Prisma CLI.
DIRECT_URL="postgres://daniel:<password>@ep-mute-rain-952417.us-east-2.aws.neon.tech/neondb"

prisma.config.ts 指向直接连接字符串

prisma.config.ts
import 'dotenv/config'
import { defineConfig, env } from 'prisma/config'

export default defineConfig({
schema: 'prisma/schema.prisma',
datasource: {
url: env('DIRECT_URL'),
},
})

在运行时,使用 @prisma/adapter-neon 实例化带有池化连接字符串的 Prisma Client

src/db/client.ts
import { PrismaClient } from '../prisma/generated/client'
import { PrismaNeon } from '@prisma/adapter-neon'

const adapter = new PrismaNeon({ connectionString: process.env.DATABASE_URL })
export const prisma = new PrismaClient({ adapter })
信息

我们强烈建议在 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 v6.16.0 以来已普遍可用。

要开始使用,请安装适用于 Neon 的 Prisma ORM 适配器

npm install @prisma/adapter-neon

更新您的 Prisma Client 实例

import { PrismaClient } from '../prisma/generated/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' })
© . This site is unofficial and not affiliated with Prisma Data, Inc.