细说Prisma Migrate

2024-08 3

Prisma Migrate 是 Prisma 提供的数据库迁移工具,旨在帮助开发者管理数据库模式的变更,使数据库结构与 Prisma 数据模型保持一致。Prisma Migrate 的功能包括生成迁移文件、应用迁移、回滚迁移、审查迁移等。

prisma migrate dev

该用于在开发环境中管理数据库迁移。它的主要作用是根据我们的 Prisma 数据模型生成和应用数据库迁移,同时帮助我们保持数据库结构与模型定义的一致性。

使用示例
假设你在 schema.prisma 文件中定义了一个新的模型或修改了现有模型,然后运行以下命令:

npx prisma migrate dev --name add_users_table

这个命令会:

  1. 检测到数据模型变化。
  2. prisma/migrations 目录生成一个带有时间戳和add_users_table名称的迁移文件:
prisma/migrations/
  ├── 20240801083121_add_users_table/
  │   ├── migration.sql
  1. 将迁移应用到开发数据库中。

prisma migrate status

在开发过程中,我们可能会频繁更改数据模型并生成多个迁移文件,同步代码到生产环境时,我们需要查看生产环境当前Prisma数据库的更改状态,此时就可以通过该命令查看。
使用示例
在生产环境中执行该命令,其输出示例如下:

root@demo:/www/wwwroot/blog# npx prisma migrate status
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
Datasource "db": MySQL database "blog" at "127.0.0.1:3306"

2 migrations found in prisma/migrations
Following migrations have not yet been applied:
20240803075853_add_role_to_user
20240803120647_update_cover_column

上述示例表明,有两个迁移文件被标记为未应用,分别是20240803075853_add_role_to_user20240803120647_update_cover_column。这时候,如果我们需要考虑哪些迁移文件是需要的,哪些是不需要的。对于不需要的迁移文件,需要通过prisma migrate resolve将其标记为已应用。对于需要的文件,就需要通过prisma migrate deploy将这些迁移应用到数据库中。

prisma migrate resolve

prisma migrate resolve 命令用于手动标记数据库迁移的状态,可将迁移状态标记为已应用、未应用、跳过等。

使用示例

npx prisma migrate resolve --applied "migration-id"

参数说明

  • --applied: 标记迁移为已应用。migration-id 是要标记的迁移文件的 ID,可以在 prisma/migrations 目录下找到。如
npx prisma migrate resolve --applied "20240803120647_update_cover_column"

--applied类似的还有两个参数,分别是:

  • --rolled-back: 标记迁移为未应用。这会让 Prisma 认为该迁移尚未执行,从而可以重新应用。

  • --skipped: 标记迁移为已跳过。Prisma 会记录该迁移已被跳过,未来的迁移操作将不再尝试应用该迁移。

prisma migrate deploy

在开发过程中,可能会频繁更改数据模型并生成多个迁移文件。当需要将这些更改应用到生产数据库时,比如刚才我们提到的20240803075853_add_role_to_user20240803120647_update_cover_column,那么就需要使用该命令来完成。

使用示例

npx prisma migrate deploy

注意,在执行该命令后,所有未应用的迁移将被依次应用,从而确保数据库结构的最新状态。因此,我们需要非常明确哪些迁移是需要的,这就需要前两步的命令 prisma migrate status确定当前未被应用的迁移文件、以及prisma migrate resolve标记迁移文件的状态。

在执行prisma migrate deploy的过程中,有可能会失败,这就需要我们检查SQL语句和数据模型,必要的话还需要修改SQL语句和数据库模型来解决。

  • prisma