166 lines
4.0 KiB
Markdown
166 lines
4.0 KiB
Markdown
# 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` 接口
|
||
|