Prisma Migrate 入门
本页解释了如何开始使用 Prisma Migrate 在开发环境中迁移你的 schema。有关更深入的开发工作流程,请参阅使用 Prisma Migrate 进行开发。
从头开始使用 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
调试和解决生产环境中失败的迁移。