方便下面文档描述理解上不清楚的时候,来这里查看相关概念。
prisma/migrations/timestramp_action/migration.sql
)。--create-only
参数,只会生成文件,不会立即执行sql语句,方便修改sql,一般用于自定义迁移。schema.prisma
npx prisma migrate dev
该操作会创建prisma/migrations/timeStamp_action/migration.sql
Prisma Migrate
在运行以开发为中心的命令时会使用第二个临时数据库,例如:
prisma migrate dev
prisma migrate reset
影子数据库会在每次运行开发命令时自动创建和删除,主要用于检测问题,如架构漂移。
影子数据库在生产中是不需要的,并且不会被prisma migrate resolve
和prisma migrate deploy
等以生产为中心的命令使用。
运行prisma migrate dev创建新迁移时,Prisma Migrate 会使用影子数据库:
添加字段shadowDatabaseUrl
.env
新增SHADOW_DATABASE_URL
,字段同DATABASE_URL
,内容为本地数据库。
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
shadowDatabaseUrl = env("SHADOW_DATABASE_URL")
}
seed.js
npx prisma db seed
开发环境中经常需要重置数据库 - 例如,切换具有不同迁移历史的代码分支之后, 当运行prisma migrate dev时,会提示migrate reset。种子脚本可以帮你在重置数据库后填充初始数据。
prisma db seed
手动调用,prisma migrate dev
或者 prisma migrate reset
会自动调用以下情况 Prisma Migrate
会触发 seeding:
prisma migrate reset
命令prisma migrate dev
重置数据库 - 例如,迁移历史发生冲突导致的或者数据库 schema 偏移(drift)导致的--skip-seed
标志可以跳过prisma migrate dev
和prisma migrate reset
的 seeding结果:重置数据库,开发数据库的数据丢失
prisma schema
prisma db pull
prisma migrate dev --name initial-migration --create-only
可能的修改sql文件
应用初始迁移
npx prisma migrate dev
Prisma Migrate 检测到数据库与迁移历史不同步,将提示你重置。确认重置(仅在开发环境中!)。
审查数据库 schema,以确保迁移能达到预期的最终状态(例如,通过与生产数据库 schema 进行比较)。
提交整个迁移历史文件和schema.prisma
文件
其他开发者需要重置开发数据库
npx prisma migrate dev
生成基线版本操作为包含数据且不能被重置的数据库(如生产数据库)初始化迁移历史
结果:不会影响线上数据
prisma migrate resolve --applied 20210426141759_initial-migration
如果你需要 baseline 多个迁移(例如,从开发环境转移后产生了更多的迁移),请为每个迁移分别运行prisma migrate resolve
命令。目的:在应用迁移之前对其进行编辑,即修改sql语句
要在应用迁移之前编辑该文件:
npx prisma migrate dev --create-only
npx prisma migrate dev
默认情况下,schema 重命名schema中的一个字段会导致:
通过修改生成的 SQL 文件来避免这种上面的情况:
生成的文件:
ALTER TABLE "Profile" DROP COLUMN "biograpy",
ADD COLUMN "biography" TEXT NOT NULL;
修改后的文件:
ALTER TABLE "Profile"
RENAME COLUMN "biograpy" TO "biography"
最后应用迁移
情况:修改字段,
可能的结果:停机
概念:可以将修改字段分解为一系列不连续的步骤,从而避免停机。 这种模式叫作 expand
和 contract
模式。
步骤:
update table set 新的字段=旧的字段
如果 Prisma Migrate 在运行prisma migrate dev时检测到迁移历史冲突, CLI 会提示要求重置数据库并重新应用迁移历史。
这时候会把线上的数据库的表删除重建,然后再执行seed.js
去填充测试数据。
开发环境中产生 Schema 偏移(drift)的原因
Schema 偏移(drift) 产生原因:
在没有使用迁移的情况下改变了数据库 schema - 例如, 通过使用prisma db push或者手动改了 schema.
npx prisma migrate reset
npx prisma migrate dev
npx prisma db pull
npx prisma migrate dev --name introspected_change
在开发环境中,修复迁移失败的最简单方法是解决根本原因并重置数据库
如果迁移过程因某些原因被打断了,请重置数据库:
prisma migrate reset