细说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
这个命令会:
- 检测到数据模型变化。
- 在
prisma/migrations
目录生成一个带有时间戳和add_users_table
名称的迁移文件:
prisma/migrations/
├── 20240801083121_add_users_table/
│ ├── migration.sql
- 将迁移应用到开发数据库中。
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_user
和20240803120647_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_user
和20240803120647_update_cover_column
,那么就需要使用该命令来完成。
使用示例
npx prisma migrate deploy
注意,在执行该命令后,所有未应用的迁移将被依次应用,从而确保数据库结构的最新状态。因此,我们需要非常明确哪些迁移是需要的,这就需要前两步的命令 prisma migrate status
确定当前未被应用的迁移文件、以及prisma migrate resolve
标记迁移文件的状态。
在执行prisma migrate deploy
的过程中,有可能会失败,这就需要我们检查SQL语句和数据模型,必要的话还需要修改SQL语句和数据库模型来解决。
- 无目录
- prisma