2026-03-27 22:20:25 +08:00
|
|
|
|
# 修改 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`,所以修改后必须重启应用才能生效!
|