开发与生产
本页解释了如何在开发和生产环境中使用 Prisma Migrate 命令。
开发环境
在开发环境中,使用 migrate dev
命令来生成和应用迁移
npx prisma migrate dev
创建和应用迁移
migrate dev
是一个开发命令,绝不应该在生产环境中使用。
此命令
- 在影子数据库中重新运行现有的迁移历史,以检测模式漂移(已编辑或删除的迁移文件,或手动更改数据库模式)
- 将待处理的迁移应用到影子数据库(例如,同事创建的新迁移)
- 如果检测到 Prisma 模式的更改,它会从这些更改生成新的迁移
- 将所有未应用的迁移应用到开发数据库,并更新
_prisma_migrations
表 - 触发生成工件(例如,Prisma Client)
migrate dev
命令将在以下情况下提示你重置数据库
- 由修改或丢失的迁移引起的迁移历史冲突
- 数据库模式已偏离迁移历史的最终状态
重置开发数据库
你也可以通过运行以下命令自行 reset
数据库,以撤消手动更改或 db push
实验
npx prisma migrate reset
migrate reset
是一个开发命令,绝不应该在生产环境中使用。
此命令
- 如果可能,删除数据库/模式¹,或者如果环境不允许删除数据库/模式¹,则执行软重置
- 如果数据库/模式¹被删除,则使用相同的名称创建一个新的数据库/模式¹
- 应用所有迁移
- 运行种子脚本
¹ 对于 MySQL 和 MongoDB,这指的是数据库;对于 PostgreSQL 和 SQL Server,指的是模式;对于 SQLite,指的是数据库文件。
注意:为了以简单且集成的方式,根据需要经常在你的开发数据库中重新创建数据,请查看我们的种子数据指南。
自定义迁移
有时,你需要在应用迁移之前修改它。例如
- 你想引入一个重要的重构,例如将博客文章标签从
String[]
更改为Tag[]
- 你想重命名一个字段(默认情况下,Prisma Migrate 将删除现有字段)
- 你想更改 1-1 关系的方向
- 你想添加无法在 Prisma Schema Language 中表示的特性 - 例如部分索引或存储过程。
--create-only
命令允许你创建一个迁移,但不应用它
npx prisma migrate dev --create-only
要应用已编辑的迁移,请再次运行 prisma migrate dev
。
有关示例,请参阅自定义迁移。
团队开发
生产和测试环境
在生产和测试环境中,使用 migrate deploy
命令来应用迁移
npx prisma migrate deploy
注意:
migrate deploy
通常应该是自动化 CI/CD 管道的一部分,我们不建议在本地运行此命令来将更改部署到生产数据库。
此命令
-
将已应用的迁移与迁移历史进行比较,并在任何迁移被修改时发出警告
WARNING The following migrations have been modified since they were applied:
20210313140442_favorite_colors -
应用待处理的迁移
migrate deploy
命令
- 如果已应用的迁移从迁移历史中丢失,则不发出警告
- 不检测漂移(生产数据库模式与迁移历史最终状态不同 - 例如,由于热修复)
- 不重置数据库或生成工件(例如 Prisma Client)
- 不依赖于影子数据库
另请参阅
咨询锁
当你运行生产命令(例如)时,Prisma Migrate 使用咨询锁
prisma migrate deploy
prisma migrate dev
prisma migrate resolve
此安全措施确保多个命令不能同时运行 - 例如,如果你快速连续合并两个拉取请求。
咨询锁有一个 10 秒超时(不可配置),并使用底层提供程序中可用的默认咨询锁机制
Prisma Migrate 的咨询锁实现纯粹是为了避免灾难性错误 - 如果你的命令超时,你需要再次运行它。
自 5.3.0
起,可以使用 PRISMA_SCHEMA_DISABLE_ADVISORY_LOCK
环境变量禁用咨询锁