跳至主要内容

Neon

本指南介绍如何

什么是 Neon?

Neon's logo

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 中提供),则需要在 DATABASE_URL 环境变量的主机名中添加 -pooler,该变量用于 Prisma 模式 datasource 块的 url 属性中

.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 对数据库执行其他操作(例如,用于迁移),则需要添加一个 DIRECT_URL 环境变量以在 Prisma 模式 datasource 块的 directUrl 属性中使用,以便 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 计算有两个主要状态:活动空闲。活动表示计算当前正在运行。如果 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 的需求,但如果您仍然遇到连接超时,则可以尝试增加此限制(除了上面描述的 connect_timeout 设置之外),方法是将 pool_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 Client

npx prisma generate

安装用于 Neon 的 Prisma ORM 适配器、Neon 无服务器驱动程序和ws软件包

npm install @prisma/adapter-neon @neondatabase/serverless ws
npm install --save-dev @types/ws

更新您的 Prisma Client 实例

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 Client,并具有完整的类型安全性。Prisma Migrate、内省和 Prisma Studio 将继续像以前一样工作,使用 Prisma 模式中定义的连接字符串。

备注

指定 PostgreSQL 模式

您可以在实例化PrismaNeon时通过传递schema选项来指定PostgreSQL 模式

const adapter = new PrismaNeon(pool, {
schema: 'myPostgresSchema'
})