You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建初始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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:40:25