library-picturebook-activity/backend/docs/ENV_CHANGE_GUIDE.md
2025-11-23 14:04:20 +08:00

255 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 修改 DATABASE_URL 后的操作指南
## 📋 操作决策树
```
修改 DATABASE_URL
├─ 只改了连接信息(地址/端口/用户名/密码/数据库名)
│ └─ schema.prisma 未修改
│ ├─ 目标数据库已有表结构 → ✅ 只需重启应用
│ └─ 目标数据库是空的 → ⚠️ 需要运行迁移
└─ 同时修改了 schema.prisma
└─ ✅ 必须执行:生成 Client + 运行迁移
```
## 🔄 场景 1只修改连接信息最常见
### 情况 A目标数据库已有表结构
**示例**:从本地数据库切换到远程数据库,但表结构已存在
```bash
# 1. 修改 .development.env 文件
DATABASE_URL="mysql://user:pass@new-host:3306/db_name?schema=public"
# 2. 重启应用即可(无需执行 Prisma 命令)
npm run start:dev
```
**原因**
- Prisma Client 在应用启动时读取 `process.env.DATABASE_URL`
- 如果目标数据库已有表结构,直接连接即可
- 不需要重新生成 Client类型定义没变
- 不需要运行迁移(表结构没变)
---
### 情况 B目标数据库是空的新数据库
**示例**:切换到全新的数据库,还没有表结构
```bash
# 1. 修改 .development.env 文件
DATABASE_URL="mysql://user:pass@new-host:3306/new_db?schema=public"
# 2. 运行迁移创建表结构
npm run prisma:migrate
# 或使用部署模式(生产环境)
npm run prisma:migrate:deploy
# 3. 重启应用
npm run start:dev
```
**原因**
- 新数据库没有表结构
- 需要运行迁移来创建表
- 迁移会读取 `process.env.DATABASE_URL` 连接到新数据库
---
## 🔄 场景 2同时修改了 schema.prisma
**示例**:修改了数据库模型(添加/删除字段、表等)
```bash
# 1. 修改 schema.prisma添加字段、表等
# 2. 生成 Prisma Client必须
npm run prisma:generate
# 3. 创建并运行迁移(必须)
npm run prisma:migrate
# 会提示输入迁移名称add_user_email_field
# 4. 重启应用
npm run start:dev
```
**原因**
- schema.prisma 改变 → TypeScript 类型定义改变 → 需要重新生成 Client
- 数据库结构改变 → 需要创建迁移并应用到数据库
---
## 📝 完整操作流程
### 开发环境(推荐流程)
```bash
cd backend
# 1. 修改 .development.env 中的 DATABASE_URL
vim .development.env
# 2. 检查目标数据库是否有表结构
# 方式 A使用 Prisma Studio 查看
npm run prisma:studio
# 方式 B直接连接数据库查看
mysql -h host -u user -p database -e "SHOW TABLES;"
# 3. 根据情况选择操作:
# 情况 1数据库已有表结构 → 只需重启
npm run start:dev
# 情况 2数据库是空的 → 运行迁移
npm run prisma:migrate
npm run start:dev
# 情况 3修改了 schema.prisma → 生成 + 迁移
npm run prisma:generate
npm run prisma:migrate
npm run start:dev
```
### 生产环境(部署流程)
```bash
cd backend
# 1. 修改生产环境配置文件或环境变量
# 注意:生产环境通常使用环境变量,而不是文件
# 2. 生成 Prisma Client
npm run prisma:generate
# 3. 运行迁移(生产环境使用 deploy不会创建新迁移
NODE_ENV=production npm run prisma:migrate:deploy
# 4. 重启应用
npm run start:prod
```
---
## ✅ 快速检查清单
修改 `DATABASE_URL` 后,按以下顺序检查:
- [ ] **只改了连接信息?**
- [ ] 目标数据库有表 → ✅ 重启应用
- [ ] 目标数据库为空 → ⚠️ 运行迁移
- [ ] **修改了 schema.prisma**
- [ ] 是 → ✅ 生成 Client + 运行迁移
- [ ] 否 → 跳过
- [ ] **应用启动后验证**
- [ ] 检查启动日志中的 DATABASE_URL
- [ ] 访问 `/api/config-verification/env-info` 验证
- [ ] 测试数据库操作是否正常
---
## 🔍 验证方法
### 1. 验证 DATABASE_URL 是否生效
```bash
# 启动应用后查看日志
npm run start:dev
# 应该看到:
# DATABASE_URL: 已设置 mysql://...
```
### 2. 验证数据库连接
```bash
# 使用 Prisma Studio 连接
npm run prisma:studio
# 如果能打开并看到表,说明连接成功
```
### 3. 验证表结构
```bash
# 检查迁移状态
npx prisma migrate status
# 应该显示All migrations have been successfully applied
```
---
## ⚠️ 常见错误
### 错误 1连接失败
```
Error: Can't reach database server
```
**解决**
- 检查 DATABASE_URL 格式是否正确
- 检查数据库服务是否运行
- 检查网络连接和防火墙
### 错误 2表不存在
```
Error: Table 'xxx' doesn't exist
```
**解决**
- 运行迁移:`npm run prisma:migrate`
- 或使用:`npx prisma db push`(仅开发环境)
### 错误 3迁移状态不一致
```
Error: The migration failed to apply
```
**解决**
- 检查迁移历史:`npx prisma migrate status`
- 重置数据库(仅开发环境):`npx prisma migrate reset`
- 或手动修复迁移文件
---
## 📚 相关命令速查
| 操作 | 命令 | 说明 |
| ----------- | ------------------------------- | ------------------------- |
| 生成 Client | `npm run prisma:generate` | 根据 schema 生成类型 |
| 创建迁移 | `npm run prisma:migrate` | 开发环境,会创建新迁移 |
| 应用迁移 | `npm run prisma:migrate:deploy` | 生产环境,只应用已有迁移 |
| 查看状态 | `npx prisma migrate status` | 查看迁移状态 |
| 打开 Studio | `npm run prisma:studio` | 可视化数据库 |
| 推送结构 | `npx prisma db push` | 直接同步 schema仅开发 |
---
## 🎯 总结
**修改 DATABASE_URL 后的最小操作**
1. **只改连接信息 + 数据库有表** → ✅ **重启应用**
2. **只改连接信息 + 数据库为空** → ⚠️ **运行迁移**
3. **修改了 schema.prisma** → ✅ **生成 Client + 运行迁移**
**记住**Prisma Client 在应用启动时读取 `process.env.DATABASE_URL`,所以修改后必须重启应用才能生效!