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

4.0 KiB
Raw Permalink Blame History

DATABASE_URL 来源说明

📍 定义位置

DATABASE_URLschema.prisma 中定义:

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")  // ← 从这里读取环境变量
}

🔄 加载流程

1. 配置文件定义

DATABASE_URL 定义在环境配置文件中:

当前配置.development.env 文件

DATABASE_URL="mysql://root:woshimima@localhost:3306/db_competition_management?schema=public"

2. NestJS ConfigModule 加载

app.module.ts 中配置:

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 时

    npx prisma generate
    
    • 读取 process.env.DATABASE_URL
    • 生成类型定义(不连接数据库)
  2. 运行迁移时

    npx prisma migrate dev
    npx prisma migrate deploy
    
    • 读取 process.env.DATABASE_URL
    • 连接到数据库执行迁移
  3. 应用运行时

    • PrismaService 初始化时读取 process.env.DATABASE_URL
    • 建立数据库连接

📂 配置文件优先级

根据 app.module.ts 的配置:

envFilePath: ['.development.env']

当前配置

  • 优先加载:.development.env
  • ⚠️ 注意:如果设置了 ignoreEnvFile: true,则不会加载文件,只使用系统环境变量

🔍 验证 DATABASE_URL 来源

方法 1查看环境变量应用运行时

# 启动应用后,访问配置验证接口
curl http://localhost:3001/api/config-verification/env-info

方法 2查看启动日志

应用启动时会在控制台显示:

=== 环境配置验证 ===
DATABASE_URL: 已设置 mysql://root:woshimima@localhost:3306/db_competition_management?schema=public

方法 3检查配置文件

cd backend
cat .development.env | grep DATABASE_URL

方法 4在代码中验证

// 在任何服务中
constructor(private configService: ConfigService) {}

const dbUrl = this.configService.get('DATABASE_URL');
console.log('DATABASE_URL:', dbUrl);

🔐 环境变量来源优先级

Prisma 读取 DATABASE_URL 的优先级:

  1. 系统环境变量(最高优先级)

    export DATABASE_URL="mysql://..."
    
  2. .env 文件(通过 ConfigModule 加载)

    • .development.env
    • .env
  3. 默认值如果都没有设置Prisma 会报错)

📝 DATABASE_URL 格式

mysql://用户名:密码@主机:端口/数据库名?参数

示例

# 本地数据库
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 编码

    # 密码: 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 接口