项目背景:个人独立快速 MVP 开发
技术栈:Node.js 24 + NestJS 10 + Prisma 6 + MySQL 8
开发模式:快速迭代、数据保留、单人开发
📋 目录
🎯 核心概念
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 push | migration |
|---|---|---|
| 执行速度 | ⚡ 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 开发最佳实践
- 开发初期:大量使用
db push,快速迭代 - 功能稳定:开始使用
migration,记录重要变更 - 生产部署:必须使用
migration,确保安全 - 数据保护:定期备份,使用
db push前备份重要数据
关键原则
- 🚀 速度优先:MVP 阶段优先考虑开发速度
- 💾 数据安全:始终保护重要业务数据
- 🔄 灵活切换:根据项目阶段选择合适的策略
- 📝 记录重要变更:关键功能使用 migration 记录
最终建议
对于您的个人 MVP 项目,推荐使用 db push 作为主要策略,在重要里程碑时使用 migration 记录变更历史。
文档生成时间:2025-10-13
适用项目:个人独立快速 MVP 开发
技术栈:Node.js 24 + NestJS 10 + Prisma 6 + MySQL 8


1010

被折叠的 条评论
为什么被折叠?



