从现有数据库导入
本指南提供了从现有 PostgreSQL 数据库导入数据到 Prisma Postgres 的分步说明。
您可以通过三个步骤完成此迁移
- 创建一个新的 Prisma Postgres 数据库。
- 通过
pg_dump
导出现有数据。 - 通过
pg_restore
将先前导出的数据导入到 Prisma Postgres 中。
在第三步中,您将使用TCP 隧道在运行 pg_restore
期间安全地连接到您的 Prisma Postgres 数据库。
先决条件
- 您现有 PostgreSQL 数据库的连接 URL
- 一个账户
- 已安装 Node.js 18+。
- PostgreSQL CLI 工具 (
pg_dump
,pg_restore
) 用于创建和恢复备份。
1. 创建新的 Prisma Postgres 数据库
按照以下步骤创建新的 Prisma Postgres 数据库
- 登录到并打开控制台。
- 在您选择的工作空间中,点击新项目按钮。
- 在名称字段中输入您的项目名称,例如 hello-ppg。
- 在 Prisma Postgres 部分,点击开始使用按钮。
- 在区域下拉菜单中,选择离您当前位置最近的区域,例如 US East (N. Virginia)。
- 点击创建项目按钮。
数据库配置完成后,在设置数据库访问部分找到您的 Prisma Postgres 连接 URL,并将其保存以备后用,您将在第 3 步中需要它。
2. 从现有数据库导出数据
在此步骤中,您将从现有数据库导出数据并将其存储在本地计算机上的 .bak
文件中。
请确保您已准备好现有数据库的连接 URL,其结构应如下所示
postgresql://USER:PASSWORD@HOST:PORT/DATABASE
展开下方查看特定提供商的说明,帮助您确定正确的连接字符串
Neon
- 确保通过关闭连接池开关选择非池化连接字符串。
sslmode
必须设置为require
并附加到您的 Neon 数据库 URL 中,命令才能工作。- 连接 URL 应类似于此
postgresql://USER:PASSWORD@YOUR-NEON-HOST/DATABASE?sslmode=require
Supabase
- 使用采用 Supavisor 会话模式的数据库连接 URL。
- 连接 URL 应类似于此
postgres://postgres.apbkobhfnmcqqzqeeqss:[YOUR-PASSWORD]@aws-0-ca-central-1.pooler.supabase.com:5432/postgres
接下来,运行以下命令导出 PostgreSQL 数据库的数据(将占位符 __DATABASE_URL__
替换为您实际的数据库连接 URL)
pg_dump \
-Fc \
-v \
-d __DATABASE_URL__ \
-n public \
-f db_dump.bak
以下是此命令中使用的 CLI 选项的快速概览
-Fc
: 使用备份的自定义格式,建议与pg_restore
一起使用-v
: 在详细模式下运行pg_dump
-d
: 指定数据库连接字符串-n
: 指定目标 PostgreSQL 模式 (schema)-f
: 指定备份文件的输出名称
运行此命令将创建一个名为 db_dump.bak
的备份文件,您将在下一步中使用它将数据恢复到 Prisma Postgres 数据库中。
3. 导入数据到 Prisma Postgres
在此步骤中,您将使用TCP 隧道连接到您的 Prisma Postgres 实例并通过 pg_restore
导入数据。
您还需要第 1 步中的 Prisma Postgres 连接 URL,它应该类似于
prisma+postgres://accelerate.prisma-data.net/?api_key=ey...
如果您当前目录中已存在一个设置了 DATABASE_URL
的 .env
文件,隧道 CLI 将自动读取它,无需手动导出。但是,如果您尚未设置 .env
文件,则需要显式设置 DATABASE_URL
环境变量。
要设置环境变量,打开您的终端并将 DATABASE_URL
环境变量设置为您的 Prisma Postgres 数据库 URL 的值(将占位符 __API_KEY__
替换为您实际数据库连接 URL 中的 API 密钥)
export DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=__API_KEY__"
如果您在终端中显式设置了 DATABASE_URL
,则该值将优先于 .env
文件中的值。
接下来,启动 TCP 隧道
npx @prisma/ppg-tunnel --host 127.0.0.1 --port 5433
Prisma Postgres auth proxy listening on 127.0.0.1:5433 🚀
Your connection is authenticated using your Prisma Postgres API key.
...
==============================
hostname: 127.0.0.1
port: 5433
username: <anything>
password: <none>
==============================
保持当前终端窗口或标签页打开,以便隧道进程持续运行并保持连接打开。
现在,使用上一步中的 db_dump.bak
备份文件,通过 pg_restore
命令将数据恢复到您的 Prisma Postgres 数据库中
PGSSLMODE=disable \
pg_restore \
-h 127.0.0.1 \
-p 5433 \
-v \
-d postgres \
./db_dump.bak \
&& echo "-complete-"
您无需向此命令提供用户名和密码凭据,因为 TCP 隧道已通过您的 Prisma Postgres 连接 URL 中的 API 密钥对您进行了身份验证。
您现在已成功将数据从现有 PostgreSQL 数据库导入到 Prisma Postgres 中 🎉
要验证导入是否成功,您可以使用Prisma Studio。您可以在中通过点击项目左侧导航中的Studio标签页打开它,或者运行此命令在本地启动 Prisma Studio
npx prisma studio
4. 更新应用程序代码以查询 Prisma Postgres
场景 A:您已在使用 Prisma ORM
如果您已在使用 Prisma ORM,您只需执行以下操作
- 将 Prisma Accelerate 扩展添加到您的项目
- 更新数据库连接 URL 并重新生成 Prisma Client
4.A.1. 添加 Prisma Accelerate 扩展
使用 Prisma Postgres 时,Prisma Accelerate 扩展是必需的。如果您当前未将 Prisma Accelerate 与 Prisma ORM 一起使用,请按照以下步骤使 Prisma ORM 与 Prisma Postgres 协同工作。
首先,在您的项目中安装 @prisma/extension-accelerate
包
npm install @prisma/extension-accelerate
然后,将扩展添加到您的 Prisma Client 实例中
import { withAccelerate } from '@prisma/extension-accelerate'
const prisma = new PrismaClient().$extends(withAccelerate())
4.A.2. 更新数据库连接 URL
数据库连接 URL 通过 schema.prisma
文件中 datasource
块的 url
进行配置。最常见的情况是,它通过名为 DATABASE_URL
的环境变量进行设置
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
接下来的步骤假定您使用 .env
文件来设置 DATABASE_URL
环境变量(如果不是这样,您可以通过您首选的方式设置环境变量)。
打开 .env
并更新 DATABASE_URL
环境变量的值以匹配您的 Prisma Postgres 连接 URL,类似于
DATABASE_URL="prisma+postgres://accelerate.prisma-data.net/?api_key=__API_KEY__"
最后一步,您需要重新生成 Prisma Client,以便更新后的环境变量生效,并且您的查询今后会发送到 Prisma Postgres
npx prisma generate --no-engine
完成后,您可以运行您的应用程序,它应该像以前一样工作。
场景 B:您尚未使用 Prisma ORM
如果您尚未使用 Prisma ORM,您需要按照以下步骤从应用程序中使用 Prisma Postgres
- 在您的项目中安装 Prisma CLI
- 内省数据库以生成 Prisma 模式
- 生成 Prisma Client
- 更新应用程序中的查询以使用 Prisma ORM
您可以在本指南中找到此过程的详细分步说明:《将 Prisma ORM 添加到现有项目》。