# 修改 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`,所以修改后必须重启应用才能生效!