下面是一套 从 0 到日常改表 的完整流程(Prisma 7 + 你项目),按顺序做即可。
前提
bash
cd /Users/lukangyong/person/im-h5-backend
.env.dev 里 DATABASE_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.sql(ALTER 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 pull → migrate diff 生成 0_init → migrate resolve --applied 0_init |
| 每次改 schema 后 | migrate dev --name xxx → generate → 改代码 → migrate deploy(其它环境) |
你现在是 有表 还是 空库 ,决定阶段 1 用 resolve 还是附录里的 deploy;之后改 schema 一律走阶段 2。