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

166 lines
4.0 KiB
Markdown
Raw Permalink 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` 中定义:
```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` 接口