跳至主要内容

数据库基线

基线是指为数据库初始化迁移历史记录的过程,该数据库:

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

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

注意:我们假设重置和播种开发数据库是可接受的。

基线是 将 Prisma Migrate 添加到具有现有数据库的项目中 的一部分。

警告

本指南不适用于 MongoDB
对于 MongoDB,使用 db push 而不是 migrate deploy

为什么要进行基线

当您将 Prisma Migrate 添加到现有项目时,您的初始迁移将包含所有必要的 SQL 代码,以重新创建您开始使用 Prisma Migrate 之前的数据库状态。

The image shows a database labelled 'Existing database', and a list of existing database features next to it - 24 tables, 13 relationships, 92 fields, 3 indexes. An arrow labelled 'represented by' connects the database features list to a box that represents a migration. The existing databases's features are represented by a single migration.

提示

您可以编辑初始迁移以包含 Prisma 模式中无法表示的模式元素,例如存储过程或触发器。

您需要此初始迁移来创建和重置开发环境

The image shows a migration history with three migrations. Each migration is represented by a file icon and a name, and all migrations are surrounded by a box labelled 'migration history'. The first migration has an additional label: "State of database before Prisma Migrate", and the two remaining migrations are labelled "Generated as part of the Prisma Migrate workflow". An arrow labelled "prisma migrate dev" connects the migration history box to a database labelled "new development database", signifying that all three migrations are applied to the development database - none are skipped.

但是,当您将迁移prisma migrate deploy 部署到已存在且无法重置的数据库(例如生产环境)时,您不希望包含初始迁移

目标数据库已经包含初始迁移创建的表和列,尝试再次创建这些元素很可能会导致错误。

A migration history represented by three migration files (file icon and name), surrounded by a a box labelled 'migration history'. The first migration is marked 'do not apply', and the second two migrations are marked 'apply'. An arrow labelled with the command 'prisma migrate deploy' points from the migration history to a database labelled 'production'.

基线通过告诉 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 migrate resolve命令。

    npx prisma migrate resolve --applied 0_init

此命令将目标迁移添加到_prisma_migrations表中,并将其标记为已应用。当您运行prisma migrate deploy以应用新的迁移时,Prisma Migrate 将:

  1. 跳过所有标记为“已应用”的迁移,包括基线迁移
  2. 应用基线迁移之后的任何新迁移