4.5.1 开发和生产环境如何同步——迁移策略:开发/测试/生产环境同步
一句话破题
环境同步的关键是让迁移文件成为"唯一真相"——所有环境都通过应用相同的迁移文件来保持一致。
多环境架构
环境配置
.env.development:
env
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/myapp_dev".env.test:
env
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/myapp_test".env.production:
env
DATABASE_URL="postgresql://user:pass@prod-host:5432/myapp_prod"工作流程
1. 开发环境创建迁移
bash
# 修改 schema.prisma 后
npx prisma migrate dev --name add_user_avatar2. 提交迁移文件到 Git
bash
git add prisma/migrations/
git commit -m "feat: add user avatar field"3. 测试环境验证
bash
# CI/CD 中
DATABASE_URL=$TEST_DATABASE_URL npx prisma migrate deploy
npm run test4. 生产环境部署
bash
# 部署脚本中
DATABASE_URL=$PROD_DATABASE_URL npx prisma migrate deployCI/CD 配置示例
yaml
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install dependencies
run: npm ci
- name: Run migrations
run: npx prisma migrate deploy
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
- name: Generate Prisma Client
run: npx prisma generate
- name: Deploy application
run: npm run deploy环境差异处理
开发 vs 生产的常见差异:
| 差异点 | 开发环境 | 生产环境 |
|---|---|---|
| 数据库 | SQLite / 本地 PostgreSQL | 云 PostgreSQL |
| 数据量 | 少量测试数据 | 大量真实数据 |
| 迁移速度 | 秒级 | 可能分钟级 |
| 回滚代价 | 可接受 | 需谨慎 |
处理方式:
prisma
// 生产环境使用 PostgreSQL 特性
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}常见问题处理
问题:迁移状态不一致
bash
# 查看迁移状态
npx prisma migrate status
# 强制标记迁移为已应用(谨慎使用)
npx prisma migrate resolve --applied "20240101120000_init"问题:数据库 schema 与迁移不匹配
bash
# 从数据库反向生成 schema(不推荐常用)
npx prisma db pull最佳实践
- 迁移文件必须提交到 Git
- 不要手动修改已应用的迁移
- 生产环境只用
migrate deploy - 团队成员及时拉取最新迁移
本节小结
- 迁移文件是环境同步的核心
- 开发用
migrate dev,生产用migrate deploy - 在 CI/CD 中自动应用迁移
- 保持迁移文件与代码同步提交
