如何创建初始Prisma迁移且不丢失PostgreSQL数据?
不丢失数据创建Prisma初始迁移的解决方案
要在已有数据的PostgreSQL数据库中初始化Prisma Migrate且不丢失数据,核心是让Prisma认可当前数据库状态为迁移后的最终状态,避免触发自动重置。按以下步骤操作:
1. 同步Schema与数据库结构
- 执行
prisma db pull,将现有数据库的表结构同步到Prisma Schema文件中,确保两者完全匹配。此操作仅更新schema.prisma,不会修改数据库。 - 执行
prisma generate更新Prisma客户端,确保新的Schema生效。
2. 生成空的初始迁移框架
- 运行
prisma migrate dev --name init --create-only,在prisma/migrations目录下生成初始迁移的文件框架(不会执行迁移操作)。 - 打开生成的迁移文件夹中的
migration.sql文件,删除所有表结构创建/修改语句,只保留(如果存在)创建_prisma_migrations表的SQL(若文件中没有该表的创建语句,可跳过此删除步骤,后续手动创建)。
3. 手动创建Prisma迁移记录表并标记初始迁移为已应用
- 连接到PostgreSQL数据库,执行以下SQL创建
_prisma_migrations表(若已存在则跳过):CREATE TABLE IF NOT EXISTS "_prisma_migrations" ( "id" VARCHAR(36) NOT NULL, "checksum" VARCHAR(64) NOT NULL, "finished_at" TIMESTAMP WITH TIME ZONE, "migration_name" VARCHAR(255) NOT NULL, "logs" TEXT, "rolled_back_at" TIMESTAMP WITH TIME ZONE, "started_at" TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(), "applied_steps_count" INTEGER NOT NULL DEFAULT 0, PRIMARY KEY ("id") ); - 插入初始迁移的记录,标记其已完成:
INSERT INTO "_prisma_migrations" (id, checksum, migration_name, started_at, finished_at, applied_steps_count) VALUES ( '生成的36位UUID', -- 可用UUID生成工具生成,如`uuidgen`命令 '迁移文件中的checksum值', -- 从生成的migration.sql文件开头的注释中获取,如`-- Checksum: xxxxx` 'init', -- 与你之前--name参数指定的迁移名称一致 now(), now(), 1 );
4. 验证迁移状态
- 执行
prisma migrate status,确认输出显示初始迁移已被应用,且数据库与Schema状态一致。 - 后续执行
prisma migrate dev时,Prisma会基于当前状态生成新的迁移,不会再触发数据库重置。
关键说明
之前执行命令触发重置的原因是:Prisma在未检测到_prisma_migrations表时,会将数据库判定为“未被Prisma管理”,此时即使Schema与数据库结构一致,Prisma也无法确认状态,从而触发重置逻辑。通过手动创建迁移表并标记初始迁移为已应用,让Prisma认可当前数据库状态为迁移后的合法状态,即可避免数据丢失。
内容的提问来源于stack exchange,提问作者Yoo SungHee
相关产品推荐
相关产品推荐

