跳到主要内容

从现有数据库导入

本指南提供了将数据从现有 MySQL 数据库导入到 Prisma Postgres 的分步说明。

你可以通过以下四个步骤完成此迁移

  1. 创建新的 Prisma Postgres 数据库。
  2. 使用 @prisma/ppg-tunnel直接连接到 Prisma Postgres 实例。
  3. 使用 pgloader将你的 MySQL 数据迁移到 Prisma Postgres。
  4. 为你的 Prisma 项目配置 Prisma Postgres。

前提条件

  • 你的现有 MySQL 数据库的连接 URL。
  • 一个账户。
  • 已安装 Node.js 18+。
  • pgloader 已安装。

我们建议在单独的 git 开发分支中尝试此迁移。

1. 创建新的 Prisma Postgres 数据库

按照以下步骤创建一个新的 Prisma Postgres 数据库

  1. 登录到并打开控制台。
  2. 在你选择的工作区中,点击 新建项目 按钮。
  3. 名称 字段中输入你的项目名称,例如 hello-ppg
  4. Prisma Postgres 部分,点击 开始使用 按钮。
  5. 区域 下拉菜单中,选择离你当前位置最近的区域,例如 US East (N. Virginia)
  6. 点击 创建项目 按钮。

数据库配置完成后,在 设置数据库访问 部分找到你的 Prisma Postgres 连接 URL 并保存以备后用,下一步中你会需要它。

2. 直接连接到 Prisma Postgres 实例

在此步骤中,你将使用安全的TCP 隧道连接到你的 Prisma Postgres 实例。

你将需要步骤 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 文件中的值。

接下来,通过执行以下命令,使用 @prisma/ppg-tunnel 包启动 TCP 隧道

npx @prisma/ppg-tunnel --host 127.0.0.1 --port 5433 
注意

你可以通过使用 --port--host 标志提供自己的主机和端口值来指定不同的主机和端口。请确保在整个指南中一致地使用相同的主机和端口值。

显示CLI结果
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>
==============================
注意

保持当前终端窗口或标签页打开,以便隧道进程持续运行并保持连接开放。

3. 使用 pgloader 将你的 MySQL 数据迁移到 Prisma Postgres

现在你已连接到 Prisma Postgres 实例,你将使用 pgloader 将数据从你的 MySQL 数据库导出到 Prisma Postgres。

打开一个单独的终端窗口并创建一个 config.load 文件

touch config.load

在你偏好的文本编辑器中打开 config.load 文件并复制粘贴以下配置

config.load
LOAD DATABASE
FROM mysql://username:password@host:PORT/database_name
INTO postgresql://user:password@127.0.0.1:5433/postgres

WITH quote identifiers, -- preserve table/column name case by quoting them
include drop,
create tables,
create indexes,
reset sequences

ALTER SCHEMA 'database_name' RENAME TO 'public';

请务必更新 config.load 文件中的以下详细信息

  • FROM url (MySQL 数据库 URL)
    • usernamepasswordhostPORTdatabase_name 替换为你 MySQL 数据库的实际连接详细信息。
    • 如果需要 SSL,请确保你的连接字符串包含 useSSL=true,例如:mysql://username:password@host:PORT/database_name?useSSL=true。请注意,使用 PlanetScale 时,附加 sslaccept=strict 将不起作用。
  • INTO url (Postgres 数据库 URL)
    • 如果你正在使用自定义的 hostport,请使用你的 TCP 隧道详细信息更新此处(为了保持一致性,本示例中为 127.0.0.1 和端口 5433)。
  • ALTER SCHEMA 'database_name' RENAME TO 'public'; 中的 database_name 更新为与你 MySQL 连接字符串中的 database_name 完全匹配。

保存包含更新凭据的配置文件后,在同一个终端窗口中,执行以下命令

pgloader config.load

你应该看到类似的日志输出,这确认了你的数据成功迁移

LOG report summary reset
table name errors rows bytes total time
------------------------- --------- --------- --------- --------------
fetch meta data 0 9 2.546s
Create Schemas 0 0 0.325s
Create SQL Types 0 0 0.635s
Create tables 0 6 5.695s
Set Table OIDs 0 3 0.328s
------------------------- --------- --------- --------- --------------
public.post 0 8 0.5 kB 4.255s
public."user" 0 4 0.1 kB 2.775s
public._prisma_migrations 0 1 0.2 kB 4.278s
------------------------- --------- --------- --------- --------------
COPY Threads Completion 0 4 5.095s
Index Build Completion 0 5 9.601s
Create Indexes 0 5 4.116s
Reset Sequences 0 2 4.540s
Primary Keys 0 3 2.917s
Create Foreign Keys 0 1 1.121s
Create Triggers 0 0 0.651s
Install Comments 0 0 0.000s
------------------------- --------- --------- --------- --------------
Total import time ✓ 13 0.8 kB 28.042s

如果你看到这样的输出,则表示你的数据已成功导出到你的 Prisma Postgres 实例。

注意

你还可以使用Prisma Studio并验证迁移是否成功

npx prisma studio

4. 为你的 Prisma 项目配置 Prisma Postgres

数据迁移完成后,你需要设置你的 Prisma 项目以使用 Prisma Postgres。步骤会因你之前是否使用 Prisma ORM 而异。

如果你之前**没有**使用过 Prisma ORM

通过在你的项目目录中运行 npx prisma init 初始化 Prisma。这将在你的项目目录中创建一个 prisma 文件夹,其中包含 schema.prisma 文件和 .env 文件(如果尚不存在)。

在生成的 .env 文件中,将 DATABASE_URL 更新为与你在步骤 1 中收到的 Prisma Postgres 连接字符串匹配

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

通过运行以下命令内省你的新迁移数据库

npx prisma db pull

此命令会使用表示你已迁移表格的模型更新你的 schema.prisma 文件,这样你就可以开始使用Prisma Client查询你的数据或使用Prisma Migrate管理未来的变更。

恭喜!你已成功将 MySQL 数据库迁移到 Prisma Postgres 并配置了你的 Prisma 项目。你的迁移教程现已完成。

注意

有关 Prisma 和 Prisma Postgres 入门的完整指南,请参阅从头开始使用 Prisma 和 Prisma Postgres

如果你之前**已经**使用过 Prisma ORM

在你的 schema.prisma 文件中,将 datasource 块中的 providermysql 更改为 postgresql

schema.prisma
datasource db {
provider = "mysql"
provider = "postgres"
url = env("DATABASE_URL")
}

在生成的 .env 文件中,将 DATABASE_URL 更新为与你在步骤 1 中收到的新 Prisma Postgres 连接字符串匹配

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

内省你的新迁移 Prisma Postgres 数据库并生成 Prisma Client

npx prisma db pull

此命令根据新的数据库模式刷新你的 Prisma 模型。

如果你之前使用过Prisma Migrate

恭喜!你已成功将 MySQL 数据库迁移到 Prisma Postgres 并配置了你的 Prisma 项目。你的迁移教程现已完成。

如果你在迁移过程中遇到任何问题,请随时通过 Discord 或通过 X 与我们联系。