prisma迁移命令有多种, npx prisma db push、migrate 系列命令、db 系列命令 一次性讲清楚,让你彻底理解 Prisma 的数据库操作流程。
🚀 一、
npx prisma db push
是什么?
直接把 schema.prisma 的结构同步到数据库,但不生成迁移文件。****
也就是说:
| 特性 | migrate dev | db push |
|---|---|---|
| 是否生成迁移文件(migrations) | ✅ 会生成 | ❌ 不会生成 |
| 是否更改数据库结构 | ✅ 会 | ✅ 会 |
| 是否用于生产环境 | ❌ 禁止 | ❌ 禁止 |
| 是否用于临时调整结构 | ❌ | ✅ 非常适合 |
| 是否会删除表/字段 | ⚠️ 会,但会提醒 | ⚠️ 会,且更危险 |
这是一个 强制同步 schema → DB 的开发阶段快速命令。
📌 使用场景
✔
适合:快速开发、试验阶段
你正在开发,还不想生成迁移文件:
npx prisma db push
马上数据库生成相应表结构。
❌ 不适合:生产环境
因为它可能导致:
- 数据丢失
- 无迁移记录
- 团队协作冲突
🚀 二、Prisma 三大类数据库命令
Prisma 的命令主要分成:
-
migrate 系列(结构安全演进)
-
db 系列(快速同步 + 种子数据)
-
model introspection 系列(反向生成模型)
下面逐个讲。
🧱 三、migrate 系列命令(用于生产)
1️⃣
npx prisma migrate dev
用于开发环境。
- 自动生成迁移
- 自动执行迁移
- 自动运行 seed
- 不允许 DB 结构与 schema 不一致
npx prisma migrate dev --name init
2️⃣
npx prisma migrate deploy
用于生产环境。
- 只执行已经存在的 migrations 文件夹中的迁移
- 不会生成新迁移
- 不会修改 schema
- 严禁直接改动 DB 结构
npx prisma migrate deploy
3️⃣
npx prisma migrate reset
重置数据库:删除所有表 → 重新执行所有迁移 → seed****
开发阶段很常用:
npx prisma migrate reset
4️⃣
npx prisma migrate diff
比较两个状态之间的差异:
npx prisma migrate diff --from-schema-datamodel schema.prisma --to-db-datasource
也可以:
- schema vs db
- schema vs schema
🛠 四、db 系列命令(用于开发和工具)
1️⃣
npx prisma db push
(你询问的)
强行同步 schema → DB,不生成迁移。
用法:
npx prisma db push
2️⃣
npx prisma db seed
执行种子数据(初始化数据):
npx prisma db seed
需要在 package.json 声明:
"prisma": {
"seed": "ts-node prisma/seed.ts"
}
3️⃣
npx prisma db pull
反向生成 schema.prisma(从数据库结构生成模型):
npx prisma db pull
适合已有数据库想自动生成 prisma schema。
🔍 五、introspect 系列(数据库 → Prisma 模型)
npx prisma introspect
和 db pull 类似,本质就是:
从数据库读取结构 → 生成 schema.prisma
npx prisma introspect
📦 六、其他常用命令
npx prisma generate
根据 schema 生成 Prisma Client:
npx prisma generate
每次修改 schema.prisma 都要执行。
npx prisma studio
一个本地数据库 GUI 可视化界面:
npx prisma studio
🧠 Prisma 命令整体关系图(超清晰)
schema.prisma
|
| (1) 开发环境同步 + 生成迁移
↓
npx prisma migrate dev
|
| (2) 生产环境执行迁移
↓
npx prisma migrate deploy
|
| (3) 重置数据库
↓
npx prisma migrate reset
(快速开发,不要生产用)
→ npx prisma db push
(数据库 → schema)
→ npx prisma db pull / introspect
(种子数据)
→ npx prisma db seed
🧨 最关键的区别(总结)
| 命令 | 会生成迁移文件? | 会修改数据库? | 用途 |
|---|---|---|---|
| migrate dev | ✅ 是 | ✅ 是 | 开发环境建表 |
| migrate deploy | ❌ 否 | ✅ 是 | 生产环境执行迁移 |
| db push | ❌ 否 | ✅ 是 | 开发阶段快速同步 |
| db pull / introspect | ❌ 否 | ❌ 否 | DB → schema |
| db seed | ❌ 否 | ❌(插入数据) | 数据初始化 |
🎯 你如果想初始化数据库结构和数据
建议用:
npx prisma migrate dev
npx prisma db seed
数据库迁移和回退
下面我把 Prisma 的迁移与回退流程 用最清晰、最专业的方式讲一遍,涵盖:
-
迁移创建流程
-
迁移执行流程(开发/生产)
-
回退迁移方式(自动/手动)
-
回退迁移的最佳实践
-
常见坑提示
这套流程你直接能用于真实项目(包括 docker/k8s)。
🚀 一、Prisma 的迁移流程(开发环境)
开发环境(migrate dev)有完整自动化流程:
1)修改 schema.prisma
比如新增字段:
model User {
id Int @id @default(autoincrement())
email String
age Int?
}
2)生成迁移 + 执行迁移
npx prisma migrate dev --name add_age_to_user
它会自动做三件事:
-
生成 migrations/…/migration.sql
-
执行 migration.sql
-
自动执行 seed(如果配置了)
例如生成:
prisma/migrations/
└─ 20250218114542_add_age_to_user/
└─ migration.sql
🚀 二、迁移执行流程(生产环境)
生产环境不能使用 migrate dev。
正确流程:
1)部署代码(带 migrations 文件夹)
生产环境只执行已有迁移,不会自动生成。
2)运行迁移
npx prisma migrate deploy
作用:
-
按顺序执行 migrations/ 里尚未执行的 SQL
-
不会自动生成迁移
-
不会自动覆盖表结构
这是生产环境的安全模式。
🚀 三、迁移的回退(Rollback)方式
Prisma 不像 Sequelize/TypeORM 那样有 down 方法。
⚠️ Prisma 默认不提供自动回退命令!****
因为回退会造成数据丢失,非常危险。
但是,有 三种方式可以回退。
⭐ 方式一(推荐):手动执行反向 SQL(专业、安全)
每个迁移是一个纯 SQL 文件:
prisma/migrations/20250218114542_add_age_to_user/migration.sql
你可以写一个手动回滚 SQL,例如:
ALTER TABLE "User" DROP COLUMN "age";
然后推一个新的迁移:
npx prisma migrate dev --name rollback_age
这就是 “回滚需要新建一个迁移” 的官方推荐方式。
优点:
- 安全
- 有记录
- 避免冲突
- 不会偷偷修改历史(非常重要)
⭐ 方式二(仅开发环境):重置数据库(彻底回退所有迁移)
危险但常用在开发阶段:
npx prisma migrate reset
这会:
-
删除所有表
-
重新执行所有迁移
-
重新执行 seed.ts
适用于:
-
你只是在开发
-
DB 没有生产数据
-
想彻底重来
生产环境禁止使用。
⭐ 方式三:删除迁移文件并重新同步 schema(不推荐)
你也可以:
-
删除某个 migrations/ 目录
-
运行 prisma migrate dev 重新生成迁移
但这会导致:
-
代码库迁移历史混乱
-
其他开发者可能已有旧迁移,产生冲突
-
生产环境无法执行历史迁移
因此 仅限本地,且你知道你在做什么的情况下使用。
🚨 最重要原则 — 迁移历史不能改(类似 Git 历史不能改)
Prisma 强调:
迁移历史是不可变的,回退就是创建新的迁移,而不是修改老迁移。
简化版原则:
- ❌ 不要修改 migration.sql
- ❌ 不要删除历史迁移(除非还没 push)
- ❌ 不要在生产使用 db push
- ❌ 不要直接改 DB 表结构
- ✔️ 使用新迁移做“前滚(forward)回滚”
- ✔️ 所有表结构变更必须被迁移记录
📌 最清晰的回退流程图
修改 schema → Prisma 创建 Migration A → 执行 Migration A
(回退)
创建 Migration B:
Migration B 中包含反向操作(比如 DROP COLUMN)
执行 Migration B
回退永远是一个新的迁移,而不是修改旧的迁移。
这就是 “前滚式回退(roll-forward rollback)” 。
🧠 举例:回退一个字段
新增年龄字段:
migration A:
ALTER TABLE "User" ADD COLUMN "age" INT;
想回退 → 创建 migration B:
ALTER TABLE "User" DROP COLUMN "age";
执行:
npx prisma migrate dev --name remove_age
数据库就回到之前的结构。
🏁 一张最终总结表(你可以收藏)
| 操作 | 开发环境 | 生产环境 |
|---|---|---|
| 生成迁移 | migrate dev | ❌ 禁止 |
| 执行迁移 | migrate dev | migrate deploy |
| 回退迁移 | 新建回退迁移 / migrate reset | 新建回退迁移 |
| 直接推表结构 | db push | ❌ 禁止 |
| 重置所有表 | migrate reset | ❌ 禁止 |