prisma的同步和迁移命令详解

115 阅读6分钟

prisma迁移命令有多种, npx prisma db push、migrate 系列命令、db 系列命令 一次性讲清楚,让你彻底理解 Prisma 的数据库操作流程。


🚀 一、

npx prisma db push

是什么?

直接把 schema.prisma 的结构同步到数据库,但不生成迁移文件。****

也就是说:

特性migrate devdb push
是否生成迁移文件(migrations)✅ 会生成❌ 不会生成
是否更改数据库结构✅ 会✅ 会
是否用于生产环境❌ 禁止❌ 禁止
是否用于临时调整结构✅ 非常适合
是否会删除表/字段⚠️ 会,但会提醒⚠️ 会,且更危险

这是一个 强制同步 schema → DB 的开发阶段快速命令。


📌 使用场景

适合:快速开发、试验阶段

你正在开发,还不想生成迁移文件:

npx prisma db push

马上数据库生成相应表结构。

❌ 不适合:生产环境

因为它可能导致:

  • 数据丢失
  • 无迁移记录
  • 团队协作冲突

🚀 二、Prisma 三大类数据库命令

Prisma 的命令主要分成:

  1. migrate 系列(结构安全演进)

  2. db 系列(快速同步 + 种子数据)

  3. 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

它会自动做三件事:

  1. 生成 migrations/…/migration.sql

  2. 执行 migration.sql

  3. 自动执行 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

这会:

  1. 删除所有表

  2. 重新执行所有迁移

  3. 重新执行 seed.ts

适用于:

  • 你只是在开发

  • DB 没有生产数据

  • 想彻底重来

生产环境禁止使用。


⭐ 方式三:删除迁移文件并重新同步 schema(不推荐)

你也可以:

  1. 删除某个 migrations/ 目录

  2. 运行 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 devmigrate deploy
回退迁移新建回退迁移 / migrate reset新建回退迁移
直接推表结构db push❌ 禁止
重置所有表migrate reset❌ 禁止