以下是如何从 Neon 切换到 Prisma Postgres 的指南 —— 这是一个无服务器数据库,具有零冷启动和慷慨的免费层级。您可以在此了解更多关于其架构的信息。

1. 创建一个新的 Prisma Postgres 实例

首先通过 Prisma 数据平台 创建一个新的 Prisma Postgres 实例,并获取您的连接字符串。它将类似于以下内容:

prisma+postgres://accelerate.prisma-data.net/?api_key=ey....

2. 更新您的环境变量

更新您的环境变量以使用新的 Prisma Postgres 连接字符串:

apps/database/.env
DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=ey...."

3. 在 @repo/database 中替换所需的依赖项

卸载现有的依赖项…

终端
pnpm remove @neondatabase/serverless @prisma/adapter-neon ws @types/ws

… 并安装新的依赖项:

终端
pnpm add @prisma/extension-accelerate

4. 更新数据库连接代码

更新数据库连接代码以使用新的 Prisma Postgres 适配器:

packages/database/index.ts
import 'server-only';

import { env } from '@repo/env';
import { withAccelerate } from '@prisma/extension-accelerate';
import { PrismaClient } from '@prisma/client';

export const database = new PrismaClient().$extends(withAccelerate());

您的项目现在已配置为使用 Prisma Postgres 实例进行迁移和查询。

5. 探索缓存和实时数据库事件

请注意,由于其他 Prisma 产品的一流集成,Prisma Postgres 附带了一些您可能会觉得有用的开箱即用功能:

缓存

要使用 Prisma Client 缓存查询,您可以将 swrttl 选项添加到任何给定的查询中,例如:

page.tsx
const pages = await prisma.page.findMany({
  swr: 60, // 60 秒
  ttl: 60  // 60 秒
});

Accelerate 文档 中了解更多信息。

实时数据库事件

要从您的数据库流式传输数据库更改事件,您首先需要安装 Pulse 扩展:

终端
pnpm add @prisma/extension-pulse

接下来,您需要将您的 Pulse API 密钥添加为环境变量:

apps/database/.env
PULSE_API_KEY="ey...."

您可以在 Prisma Postgres 连接字符串中找到您的 Pulse API 密钥,它是 api_key 参数的值,并以 ey... 开头。或者,您可以在 Prisma Postgres 仪表板 中找到该 API 密钥。

然后,更新 env 包以包含新的 PULSE_API_KEY 环境变量:

packages/env/index.ts
export const server = {
  // ...
  PULSE_API_KEY: z.string().min(1).startsWith('ey'),
};

export const env = createEnv({
  client,
  server,
  runtimeEnv: {
    // ...
    PULSE_API_KEY: process.env.PULSE_API_KEY,
  },
});

最后,更新数据库连接代码以包含 Pulse 扩展:

packages/database/index.ts
import 'server-only';
import { withPulse } from '@prisma/extension-pulse';
import { withAccelerate } from '@prisma/extension-accelerate';
import { PrismaClient } from '@prisma/client';
import { env } from '@repo/env';

export const database = new PrismaClient()
  .$extends(withAccelerate())
  .$extends(withPulse({ apiKey: env.PULSE_API_KEY })) ;

您现在可以使用以下代码从数据库中流式传输任何更改事件:

page.tsx
const stream = await prisma.page.stream();

console.log(`等待 \`Page\` 表上的事件... `);

for await (const event of stream) {
  console.log('收到事件:', event);
}

Pulse 文档 中了解更多信息。