Prisma Migrate 入门
本页介绍如何在开发环境中使用 Prisma Migrate 开始迁移您的 schema。
从头开始使用 Prisma Migrate
在开发环境中开始使用 Prisma Migrate
-
创建 Prisma schema
schema.prismadatasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
name String
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
published Boolean @default(true)
authorId Int
author User @relation(fields: [authorId], references: [id])
}提示您可以在您的 schema 中使用原生类型映射属性来决定要创建的精确数据库类型(例如,
String
可以映射到varchar(100)
或text
)。- 创建第一个迁移
prisma migrate dev --name init
显示CLI结果您的 Prisma schema 现在已与您的数据库 schema 同步,并且您已初始化了迁移历史记录
migrations/
└─ 20210313140442_init/
└─ migration.sql -
向您的 schema 添加其他字段
model User {
id Int @id @default(autoincrement())
jobTitle String
name String
posts Post[]
} -
创建第二个迁移
prisma migrate dev --name added_job_title
显示CLI结果您的 Prisma schema 再次与您的数据库 schema 同步,并且您的迁移历史记录包含两个迁移
migrations/
└─ 20210313140442_init/
└─ migration.sql
└─ 20210313140442_added_job_title/
└─ migration.sql
您现在拥有一个迁移历史记录,您可以将其源代码控制,并使用它来将更改部署到测试环境和生产环境。
向现有项目添加 Prisma Migrate
向现有项目添加 Prisma Migrate 涉及的步骤包括
- 内省您的数据库以更新您的 Prisma schema
- 创建基线迁移
- 更新您的 schema 或迁移以解决 Prisma Schema Language 不支持的功能
- 应用基线迁移
- 提交迁移历史记录和 Prisma schema
内省以创建或更新您的 Prisma schema
确保您的 Prisma schema 与您的数据库 schema 同步。如果您正在使用以前版本的 Prisma Migrate,则应该已经如此。
- 内省数据库以确保您的 Prisma schema 是最新的
prisma db pull
创建基线迁移
基线化是为一个数据库初始化迁移历史记录的过程,该数据库
- 在您开始使用 Prisma Migrate 之前就已存在
- 包含必须维护的数据(例如生产环境),这意味着数据库无法重置
基线化告诉 Prisma Migrate 假设一个或多个迁移已被应用。这可以防止生成的迁移在尝试创建已存在的表和字段时失败。
要创建基线迁移
- 如果您有
prisma/migrations
文件夹,请删除、移动、重命名或存档此文件夹。 - 运行以下命令以在内部创建具有您首选名称的
migrations
目录。此示例将使用0_init
作为迁移名称mkdir -p prisma/migrations/0_init
注意0_
很重要,因为 Prisma Migrate 以字典顺序应用迁移。您可以使用不同的值,例如当前时间戳。 - 生成迁移并使用
prisma migrate diff
将其保存到文件npx prisma migrate diff \
--from-empty \
--to-schema-datamodel prisma/schema.prisma \
--script > prisma/migrations/0_init/migration.sql - 查看生成的迁移。
解决 Prisma Schema Language 不支持的功能
要包含数据库中已存在的不支持的数据库功能,您必须替换或修改初始迁移 SQL
- 打开在创建基线迁移部分中生成的
migration.sql
文件。 - 修改生成的 SQL。例如
- 如果更改较小,您可以将其他自定义 SQL 附加到生成的迁移。以下示例创建一个部分索引
/* Generated migration SQL */
CREATE UNIQUE INDEX tests_success_constraint ON posts (subject, target)
WHERE success; - 如果更改很大,则用数据库转储的结果替换整个迁移文件可能会更容易(
mysqldump
,pg_dump
)。当为此使用pg_dump
时,您需要使用以下命令更新search_path
:SELECT pg_catalog.set_config('search_path', '', false);
;否则您将遇到以下错误:The underlying table for model '_prisma_migrations' does not exist.
`信息请注意,一次创建所有表时,表的顺序很重要,因为外键是在同一步骤中创建的。因此,要么重新排序它们,要么将约束创建移动到所有表创建后的最后一步,这样您就不会遇到
can't create constraint
错误
应用初始迁移
要应用您的初始迁移
-
针对您的数据库运行以下命令
npx prisma migrate resolve --applied 0_init
-
查看数据库 schema 以确保迁移达到预期的最终状态(例如,通过将 schema 与生产数据库进行比较)。
新的迁移历史记录和数据库 schema 现在应与您的 Prisma schema 同步。
提交迁移历史记录和 Prisma schema
将以下内容提交到源代码控制
- 整个迁移历史记录文件夹
schema.prisma
文件
更进一步
- 有关将迁移部署到生产环境的更多信息,请参阅使用 Prisma Migrate 部署数据库更改指南。
- 请参阅生产环境故障排除指南,了解如何使用
prisma migrate diff
、prisma db execute
和/或prisma migrate resolve
在生产环境中调试和解决失败的迁移。