跳到主要内容

Prisma Migrate 入门

本页解释了如何开始使用 Prisma Migrate 在开发环境中迁移你的 schema。有关更深入的开发工作流程,请参阅使用 Prisma Migrate 进行开发

从头开始使用 Prisma Migrate

要在开发环境中使用 Prisma Migrate,请执行以下操作

  1. 创建一个 Prisma schema

    schema.prisma
    datasource 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)。

    1. 创建第一次迁移
    prisma migrate dev --name init
    显示CLI结果

    你的 Prisma schema 现在与你的数据库 schema 同步,并且你已经初始化了迁移历史

    migrations/
    └─ 20210313140442_init/
    └─ migration.sql
  2. 向你的 schema 添加额外的字段

    model User {
    id Int @id @default(autoincrement())
    jobTitle String
    name String
    posts Post[]
    }
  3. 创建第二次迁移

    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所涉及的步骤是

  1. 内省你的数据库以更新你的 Prisma schema
  2. 创建一个基线迁移
  3. 更新你的 schema 或迁移,以解决 Prisma Schema Language 不支持的功能
  4. 应用基线迁移
  5. 提交迁移历史和 Prisma schema

内省以创建或更新你的 Prisma schema

确保你的 Prisma schema 与你的数据库 schema 同步。如果你正在使用以前版本的 Prisma Migrate,则应该已经如此。

  1. 内省数据库以确保你的 Prisma schema 是最新的
    prisma db pull

创建一个基线迁移

基线化是为以下数据库初始化迁移历史的过程

  • 在你开始使用 Prisma Migrate 之前已经存在
  • 包含必须维护的数据(如生产环境),这意味着无法重置数据库

基线化告诉 Prisma Migrate 假设已经应用了一个或多个迁移。这可以防止在尝试创建已经存在的表和字段时生成的迁移失败。

要创建基线迁移

  1. 如果你有prisma/migrations文件夹,请删除、移动、重命名或存档此文件夹。
  2. 运行以下命令以使用你喜欢的名称在其中创建一个migrations目录。此示例将使用0_init作为迁移名称
    mkdir -p prisma/migrations/0_init
    注意

    0_很重要,因为 Prisma Migrate 按照字典顺序应用迁移。你可以使用不同的值,例如当前时间戳。

  3. 生成迁移并使用prisma migrate diff将其保存到文件中
    npx prisma migrate diff \
    --from-empty \
    --to-schema-datamodel prisma/schema.prisma \
    --script > prisma/migrations/0_init/migration.sql
  4. 查看生成的迁移。

解决 Prisma Schema Language 不支持的功能

要包含数据库中已存在的不支持的数据库功能,你必须替换或修改初始迁移 SQL

  1. 打开在创建基线迁移部分中生成的migration.sql文件。
  2. 修改生成的 SQL。例如
  • 如果更改较小,你可以将其他自定义 SQL 附加到生成的迁移中。以下示例创建一个部分索引
    /* Generated migration SQL */

    CREATE UNIQUE INDEX tests_success_constraint ON posts (subject, target)
    WHERE success;
  • 如果更改很大,则将整个迁移文件替换为数据库转储的结果可能更容易(mysqldumppg_dump)。当为此使用pg_dump时,你需要使用以下命令更新search_pathSELECT pg_catalog.set_config('search_path', '', false);;否则你会遇到以下错误:The underlying table for model '_prisma_migrations' does not exist. `
    信息

    请注意,当同时创建所有表时,表的顺序很重要,因为外键是在同一步骤创建的。因此,请重新排序它们,或将约束创建移至创建所有表后的最后一步,这样你就不会遇到can't create constraint错误

应用初始迁移

要应用你的初始迁移

  1. 针对你的数据库运行以下命令

    npx prisma migrate resolve --applied 0_init
  2. 查看数据库 schema 以确保迁移达到预期的最终状态(例如,通过将 schema 与生产数据库进行比较)。

新的迁移历史和数据库 schema 现在应与你的 Prisma schema 同步。

提交迁移历史和 Prisma schema

将以下内容提交到源代码控制

  • 整个迁移历史文件夹
  • schema.prisma文件

更进一步