2026-03-27 22:20:25 +08:00
|
|
|
|
# DATABASE_URL 来源说明
|
|
|
|
|
|
|
|
|
|
|
|
## 📍 定义位置
|
|
|
|
|
|
|
|
|
|
|
|
`DATABASE_URL` 在 `schema.prisma` 中定义:
|
|
|
|
|
|
|
|
|
|
|
|
```prisma
|
|
|
|
|
|
datasource db {
|
|
|
|
|
|
provider = "mysql"
|
|
|
|
|
|
url = env("DATABASE_URL") // ← 从这里读取环境变量
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🔄 加载流程
|
|
|
|
|
|
|
|
|
|
|
|
### 1. 配置文件定义
|
|
|
|
|
|
|
|
|
|
|
|
`DATABASE_URL` 定义在环境配置文件中:
|
|
|
|
|
|
|
|
|
|
|
|
**当前配置**:`.development.env` 文件
|
|
|
|
|
|
```env
|
|
|
|
|
|
DATABASE_URL="mysql://root:woshimima@localhost:3306/db_competition_management?schema=public"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 2. NestJS ConfigModule 加载
|
|
|
|
|
|
|
|
|
|
|
|
在 `app.module.ts` 中配置:
|
|
|
|
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
|
|
ConfigModule.forRoot({
|
|
|
|
|
|
isGlobal: true,
|
|
|
|
|
|
envFilePath: ['.development.env'], // ← 从这里加载环境变量
|
|
|
|
|
|
})
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**加载顺序**:
|
|
|
|
|
|
1. NestJS ConfigModule 读取 `.development.env` 文件
|
|
|
|
|
|
2. 将文件中的 `DATABASE_URL` 加载到 `process.env.DATABASE_URL`
|
|
|
|
|
|
3. 应用启动时,所有模块都可以通过 `ConfigService` 访问
|
|
|
|
|
|
|
|
|
|
|
|
### 3. Prisma 读取
|
|
|
|
|
|
|
|
|
|
|
|
Prisma 在以下时机读取 `DATABASE_URL`:
|
|
|
|
|
|
|
|
|
|
|
|
1. **生成 Prisma Client 时**:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
npx prisma generate
|
|
|
|
|
|
```
|
|
|
|
|
|
- 读取 `process.env.DATABASE_URL`
|
|
|
|
|
|
- 生成类型定义(不连接数据库)
|
|
|
|
|
|
|
|
|
|
|
|
2. **运行迁移时**:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
npx prisma migrate dev
|
|
|
|
|
|
npx prisma migrate deploy
|
|
|
|
|
|
```
|
|
|
|
|
|
- 读取 `process.env.DATABASE_URL`
|
|
|
|
|
|
- 连接到数据库执行迁移
|
|
|
|
|
|
|
|
|
|
|
|
3. **应用运行时**:
|
|
|
|
|
|
- `PrismaService` 初始化时读取 `process.env.DATABASE_URL`
|
|
|
|
|
|
- 建立数据库连接
|
|
|
|
|
|
|
|
|
|
|
|
## 📂 配置文件优先级
|
|
|
|
|
|
|
|
|
|
|
|
根据 `app.module.ts` 的配置:
|
|
|
|
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
|
|
envFilePath: ['.development.env']
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**当前配置**:
|
|
|
|
|
|
- ✅ 优先加载:`.development.env`
|
|
|
|
|
|
- ⚠️ 注意:如果设置了 `ignoreEnvFile: true`,则不会加载文件,只使用系统环境变量
|
|
|
|
|
|
|
|
|
|
|
|
## 🔍 验证 DATABASE_URL 来源
|
|
|
|
|
|
|
|
|
|
|
|
### 方法 1:查看环境变量(应用运行时)
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 启动应用后,访问配置验证接口
|
|
|
|
|
|
curl http://localhost:3001/api/config-verification/env-info
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 方法 2:查看启动日志
|
|
|
|
|
|
|
|
|
|
|
|
应用启动时会在控制台显示:
|
|
|
|
|
|
```
|
|
|
|
|
|
=== 环境配置验证 ===
|
|
|
|
|
|
DATABASE_URL: 已设置 mysql://root:woshimima@localhost:3306/db_competition_management?schema=public
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 方法 3:检查配置文件
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd backend
|
|
|
|
|
|
cat .development.env | grep DATABASE_URL
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 方法 4:在代码中验证
|
|
|
|
|
|
|
|
|
|
|
|
```typescript
|
|
|
|
|
|
// 在任何服务中
|
|
|
|
|
|
constructor(private configService: ConfigService) {}
|
|
|
|
|
|
|
|
|
|
|
|
const dbUrl = this.configService.get('DATABASE_URL');
|
|
|
|
|
|
console.log('DATABASE_URL:', dbUrl);
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🔐 环境变量来源优先级
|
|
|
|
|
|
|
|
|
|
|
|
Prisma 读取 `DATABASE_URL` 的优先级:
|
|
|
|
|
|
|
|
|
|
|
|
1. **系统环境变量**(最高优先级)
|
|
|
|
|
|
```bash
|
|
|
|
|
|
export DATABASE_URL="mysql://..."
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
2. **.env 文件**(通过 ConfigModule 加载)
|
|
|
|
|
|
- `.development.env`
|
|
|
|
|
|
- `.env`
|
|
|
|
|
|
|
|
|
|
|
|
3. **默认值**(如果都没有设置,Prisma 会报错)
|
|
|
|
|
|
|
|
|
|
|
|
## 📝 DATABASE_URL 格式
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
mysql://用户名:密码@主机:端口/数据库名?参数
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**示例**:
|
|
|
|
|
|
```env
|
|
|
|
|
|
# 本地数据库
|
|
|
|
|
|
DATABASE_URL="mysql://root:password@localhost:3306/db_competition_management?schema=public"
|
|
|
|
|
|
|
|
|
|
|
|
# 远程数据库
|
|
|
|
|
|
DATABASE_URL="mysql://user:pass@192.168.1.100:3306/db_name?schema=public"
|
|
|
|
|
|
|
|
|
|
|
|
# 带 SSL
|
|
|
|
|
|
DATABASE_URL="mysql://user:pass@host:3306/db_name?schema=public&sslmode=require"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## ⚠️ 注意事项
|
|
|
|
|
|
|
|
|
|
|
|
1. **密码包含特殊字符**:需要进行 URL 编码
|
|
|
|
|
|
```env
|
|
|
|
|
|
# 密码: p@ssw0rd
|
|
|
|
|
|
DATABASE_URL="mysql://user:p%40ssw0rd@localhost:3306/db"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
2. **配置文件安全**:
|
|
|
|
|
|
- `.development.env` 不应提交到 Git
|
|
|
|
|
|
- 生产环境使用环境变量或密钥管理服务
|
|
|
|
|
|
|
|
|
|
|
|
3. **Prisma 读取时机**:
|
|
|
|
|
|
- Prisma 直接读取 `process.env.DATABASE_URL`
|
|
|
|
|
|
- 不依赖 NestJS ConfigModule(但 ConfigModule 会将文件内容加载到 `process.env`)
|
|
|
|
|
|
|
|
|
|
|
|
## 🔧 当前配置总结
|
|
|
|
|
|
|
|
|
|
|
|
- **配置文件**:`.development.env`
|
|
|
|
|
|
- **配置项**:`DATABASE_URL="mysql://root:woshimima@localhost:3306/db_competition_management?schema=public"`
|
|
|
|
|
|
- **加载方式**:NestJS ConfigModule → `process.env` → Prisma
|
|
|
|
|
|
- **验证方式**:启动日志或 `/api/config-verification/env-info` 接口
|
|
|
|
|
|
|