跳到主要内容

从现有数据库导入

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

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

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

先决条件

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

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

1. 创建一个新的 Prisma Postgres 数据库

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

  1. 登录到并打开控制台。
  2. 在您选择的工作区中,单击 New project (新建项目)按钮。
  3. Name (名称)字段中,键入项目的名称,例如 hello-ppg
  4. Prisma Postgres 部分,单击 Get started (开始使用)按钮。
  5. Region (区域)下拉列表中,选择离您当前位置最近的区域,例如 US East (N. Virginia) (美国东部(弗吉尼亚北部))。
  6. 单击 Create project (创建项目)按钮。

数据库配置完成后,在 Set up database access (设置数据库访问权限)部分找到您的 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:[email protected]: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 数据库的实际连接详细信息。
    • 确保您的连接字符串包含 useSSL=true (如果需要 SSL),例如: mysql://username:password@host:PORT/database_name?useSSL=true。请注意,当使用 PlanetScale 时,附加 sslaccept=strict 将不起作用。
  • INTO url(Postgres 数据库 URL)
    • 如果您使用自定义 hostport 更新此项(在本例中,为了保持一致性,它是 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 Postgres 配置您的 Prisma 项目

迁移数据后,您需要设置您的 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 项目。您的迁移教程现已完成。

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