# 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` 接口

