Prisma 数据库同步策略对比文档

项目背景:个人独立快速 MVP 开发
技术栈:Node.js 24 + NestJS 10 + Prisma 6 + MySQL 8
开发模式:快速迭代、数据保留、单人开发


📋 目录


🎯 核心概念

推荐claude code公益站
在这里插入图片描述

db push

npx prisma db push
  • 直接同步:将 Prisma schema 直接同步到数据库
  • 无版本控制:不生成 migration 文件
  • 即时生效:立即应用所有 schema 变更

migration

npx prisma migrate dev --name feature_name
npx prisma migrate deploy
  • 版本控制:生成 migration 文件记录变更历史
  • 团队协作:支持多人开发环境同步
  • 生产部署:支持生产环境安全升级

🔄 使用场景对比

db push 适用场景

个人 MVP 开发
  • 快速原型:频繁修改 schema,需要快速测试
  • 数据保留:不想丢失现有测试数据
  • 实验性变更:不确定最终结构,需要快速迭代
  • 单人开发:不需要团队协作
开发阶段特征
# 典型使用场景
npx prisma db push --accept-data-loss
  • 添加新字段测试功能
  • 修改字段类型
  • 删除不需要的字段
  • 调整表关系

migration 适用场景

团队协作开发
  • 多人开发:需要同步团队成员的数据库结构
  • 版本控制:记录每次结构变更的历史
  • 代码审查:migration 文件可以 review
  • 生产部署:生产环境安全升级
生产环境特征
# 生产环境部署
npx prisma migrate deploy
  • 按版本逐步升级数据库
  • 支持回滚到之前的版本
  • 确保生产数据安全

⚙️ 技术实现对比

db push 技术细节

工作原理
// 1. 读取 schema.prisma
// 2. 与当前数据库结构对比
// 3. 生成 DDL 语句
// 4. 直接执行到数据库
执行流程
Environment variables loaded from .env
Prisma schema loaded from prisma\schema.prisma
Datasource "db": MySQL database "hr_sys" at "118.89.83.45:3306"

Your database is now in sync with your Prisma schema. Done in 2.47s
优势
  • 速度快:直接同步,无需生成文件
  • 🔄 实时性:立即看到变更效果
  • 💾 数据安全:默认保留现有数据
  • 🎯 简单直接:一条命令完成
劣势
  • 无历史记录:无法追踪变更历史
  • 无回滚:无法回退到之前版本
  • 团队协作困难:无法同步给其他开发者

migration 技术细节

工作原理
// 1. 分析 schema 变更
// 2. 生成 migration.sql 文件
// 3. 记录到 _prisma_migrations 表
// 4. 执行 SQL 到数据库
执行流程
Environment variables loaded from .env
Prisma schema loaded from prisma\schema.prisma

The following migration(s) have been applied:
migrations/
  └─ 20250109123456_remove_position_departmentid/
    └─ migration.sql
优势
  • 📝 历史记录:完整的变更历史
  • 🔄 可回滚:支持版本回退
  • 👥 团队协作:支持多人开发
  • 🚀 生产安全:生产环境最佳实践
劣势
  • 🐌 速度慢:需要生成文件,执行较慢
  • 💥 数据风险:可能清空开发数据
  • 🔧 复杂度高:需要管理 migration 文件

📊 性能对比

指标db pushmigration
执行速度⚡ 2-5秒🐌 10-30秒
文件生成❌ 无✅ 有
数据保留✅ 默认保留⚠️ 可能丢失
回滚能力❌ 无✅ 有
团队同步❌ 不支持✅ 支持
生产部署❌ 不推荐✅ 推荐

实际测试数据

db push 性能
# 典型执行时间
Your database is now in sync with your Prisma schema. Done in 2.47s
migration 性能
# 典型执行时间
Database reset successful
The following migration(s) have been applied:
Done in 15.32s

🎯 最佳实践

个人 MVP 开发策略

阶段1:快速原型(使用 db push)
# 频繁的 schema 变更
npx prisma db push --accept-data-loss

# 快速测试新功能
npx prisma db push

# 实验性字段调整
npx prisma db push
阶段2:功能稳定(开始使用 migration)
# 重要功能完成时
npx prisma migrate dev --name add_user_authentication

# 核心业务逻辑确定时
npx prisma migrate dev --name implement_department_hierarchy
阶段3:生产准备(必须使用 migration)
# 生产环境部署
npx prisma migrate deploy

# 版本管理
npx prisma migrate status

数据管理策略

开发阶段数据保护
# 重要数据备份
mysqldump -h 118.89.83.45 -u gxj -p hr_sys > backup_$(date +%Y%m%d).sql

# 使用 db push 前备份
cp backup_$(date +%Y%m%d).sql backup_before_push.sql
生产环境数据安全
# 生产环境必须使用 migration
npx prisma migrate deploy

# 生产数据备份
mysqldump -h prod-server -u prod-user -p prod_db > prod_backup.sql

🤔 决策矩阵

选择 db push 的条件

  • ✅ 个人独立开发
  • ✅ 快速 MVP 阶段
  • ✅ 需要保留测试数据
  • ✅ 频繁 schema 变更
  • ✅ 实验性功能开发

选择 migration 的条件

  • ✅ 团队协作开发
  • ✅ 功能相对稳定
  • ✅ 需要版本控制
  • ✅ 生产环境部署
  • ✅ 需要回滚能力

混合使用策略

# 开发阶段:90% 使用 db push
npx prisma db push

# 重要里程碑:使用 migration
npx prisma migrate dev --name milestone_v1

# 生产部署:必须使用 migration
npx prisma migrate deploy

📝 实际案例

案例1:移除字段(我们刚完成的)

使用 db push
# 修改 schema.prisma
model Position {
  id           Int      @id @default(autoincrement())
  name         String   @unique
  description  String?
  # departmentId Int  # 移除这个字段
  level        String   @db.VarChar(10)
}

# 执行同步
npx prisma db push --accept-data-loss
# 结果:数据库已同步,数据保留
如果使用 migration
# 会生成 migration 文件
# 20250109123456_remove_position_departmentid/migration.sql
ALTER TABLE `positions` DROP COLUMN `departmentId`;

# 但可能清空开发数据

案例2:添加新功能

开发阶段(db push)
# 添加新字段
model User {
  id       Int     @id @default(autoincrement())
  username String  @unique
  # 新增字段
  avatar   String?
  bio      String?
}

# 快速同步
npx prisma db push
功能稳定后(migration)
# 生成正式 migration
npx prisma migrate dev --name add_user_profile_fields

🚀 推荐策略

个人 MVP 开发推荐

开发阶段(0-3个月)
# 主要使用 db push
npx prisma db push --accept-data-loss

# 频率:每天 5-10 次
# 目的:快速迭代,保留数据
功能完善阶段(3-6个月)
# 混合使用
# 日常开发:db push
npx prisma db push

# 重要功能:migration
npx prisma migrate dev --name add_payment_system
生产准备阶段(6个月+)
# 主要使用 migration
npx prisma migrate dev --name production_ready

# 生产部署
npx prisma migrate deploy

数据安全建议

开发环境
# 定期备份重要数据
mysqldump -h 118.89.83.45 -u gxj -p hr_sys users departments > important_data.sql

# 使用 db push 前备份
cp important_data.sql backup_$(date +%Y%m%d_%H%M%S).sql
生产环境
# 必须使用 migration
npx prisma migrate deploy

# 生产数据备份
mysqldump -h prod-server -u prod-user -p prod_db > prod_backup_$(date +%Y%m%d).sql

📚 总结

个人 MVP 开发最佳实践

  1. 开发初期:大量使用 db push,快速迭代
  2. 功能稳定:开始使用 migration,记录重要变更
  3. 生产部署:必须使用 migration,确保安全
  4. 数据保护:定期备份,使用 db push 前备份重要数据

关键原则

  • 🚀 速度优先:MVP 阶段优先考虑开发速度
  • 💾 数据安全:始终保护重要业务数据
  • 🔄 灵活切换:根据项目阶段选择合适的策略
  • 📝 记录重要变更:关键功能使用 migration 记录

最终建议

对于您的个人 MVP 项目,推荐使用 db push 作为主要策略,在重要里程碑时使用 migration 记录变更历史。


文档生成时间:2025-10-13
适用项目:个人独立快速 MVP 开发
技术栈:Node.js 24 + NestJS 10 + Prisma 6 + MySQL 8

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值