Prisma 表格更新 流程

下面是一套 从 0 到日常改表 的完整流程(Prisma 7 + 你项目),按顺序做即可。


前提

bash 复制代码
cd /Users/lukangyong/person/im-h5-backend

.env.devDATABASE_URL 正确,且 不要用 migrate reset(会删库)。


阶段 0:一次性准备(只做一次)

bash 复制代码
# 安装依赖(若还没有)
npm install

# 确认 schema 和当前 MySQL 一致(表已存在时必做)
npx dotenv-cli -e .env.dev -- npx prisma db pull
npx prisma generate

阶段 1:第一次做迁移(Baseline,表已经在库里)

适用:MySQL 里表已经有了 ,以前只用 pull,从没用过 migrate

1.1 生成「初始迁移」文件(只写文件,不执行)

bash 复制代码
mkdir -p prisma/migrations/0_init

npx dotenv-cli -e .env.dev -- npx prisma migrate diff \
  --from-empty \
  --to-schema=prisma/schema.prisma \
  --script > prisma/migrations/0_init/migration.sql

1.2 告诉 Prisma:当前库 = 已经跑过这条迁移

bash 复制代码
npx dotenv-cli -e .env.dev -- npx prisma migrate resolve --applied 0_init

不要 对已有数据的库再 migrate deploy 这条 0_init,否则会重复建表。

只有 空库 才用 migrate deploy 执行 0_init(见文末附录)。

1.3 检查 + 提交 Git

bash 复制代码
npx dotenv-cli -e .env.dev -- npx prisma migrate status
npx prisma generate

git add prisma/schema.prisma prisma/migrations/
git commit -m "chore: baseline prisma migrate"

阶段 1 结束。 此后 Prisma 有迁移历史,数据仍在。


阶段 2:第一次 baseline 之后,你改了 schema(日常流程)

例如:给 users 加一列 remark

2.1 改 prisma/schema.prisma

prisma 复制代码
model users {
  // ...
  remark String? @default("") @db.VarChar(200)
}

建议新列:可空 ?@default(...),老数据不用手动填。

2.2 生成迁移 + 应用到本地库

bash 复制代码
npx dotenv-cli -e .env.dev -- npx prisma migrate dev --name add_users_remark

会自动:

  • 新建 prisma/migrations/202xxxxx_add_users_remark/migration.sqlALTER TABLE ...
  • 在本地 MySQL 执行
  • 保留原有行数据

2.3 更新 Client

bash 复制代码
npx prisma generate

2.4 改业务代码

  • admin:service / Vo / Zod 等
  • 若 IM 同表仍用 mysql2:IM 的 SQL 也要改

2.5 提交 + 其它环境部署

bash 复制代码
git add prisma/schema.prisma prisma/migrations/ src/
git commit -m "feat: add users.remark"

# 测试 / 生产(只执行未跑过的迁移,不 reset)
npx dotenv-cli -e .env.prod -- npx prisma migrate deploy
npx prisma generate

以后每次改表:重复阶段 2 即可(2.1 → 2.2 → 2.3 → 2.4 → 2.5)。


一张图(心里要有数)

复制代码
【只做一次】
  db pull(对齐)→ diff 生成 0_init → migrate resolve --applied 0_init

【以后每次改表】
  改 schema.prisma
       ↓
  migrate dev --name xxx
       ↓
  generate
       ↓
  改代码
       ↓
  commit migrations + 代码
       ↓
  其它环境 migrate deploy

可选:改 schema 前先看会生成什么 SQL

bash 复制代码
npx dotenv-cli -e .env.dev -- npx prisma migrate diff \
  --from-config-datasource \
  --to-schema=prisma/schema.prisma \
  --script

migrate dev 对比的是:只看不执行


禁止命令(有数据时)

bash 复制代码
# ❌ 删库 + 重建
npx dotenv-cli -e .env.dev -- npx prisma migrate reset

附录:若库是空的(被 reset 过、没备份)

不要 resolve,要 执行 init:

bash 复制代码
mkdir -p prisma/migrations/0_init
npx dotenv-cli -e .env.dev -- npx prisma migrate diff \
  --from-empty \
  --to-schema=prisma/schema.prisma \
  --script > prisma/migrations/0_init/migration.sql

npx dotenv-cli -e .env.dev -- npx prisma migrate deploy
npx prisma generate

然后再进入 阶段 2 做加列等变更。


最短记忆版

时机 命令
第一次(有表有数据) db pullmigrate diff 生成 0_initmigrate resolve --applied 0_init
每次改 schema 后 migrate dev --name xxxgenerate → 改代码 → migrate deploy(其它环境)

你现在是 有表 还是 空库 ,决定阶段 1 用 resolve 还是附录里的 deploy之后改 schema 一律走阶段 2