本文目录导读:

默认情况下,Pydantic 不会自动加载环境变量。
Pydantic v2 主要通过以下方式加载环境变量,需要你明确指定或使用特定配置:
最常用的方式:Field(validation_alias) + SettingsConfigDict
在 Pydantic v2 中,通常使用 BaseSettings 类(来自 pydantic-settings 库)并配合 SettingsConfigDict 来自动加载环境变量。
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_prefix='MYAPP_') # 可选:环境变量前缀
database_url: str = "default_localhost" # 如果环境变量存在,会自动覆盖
api_key: str = "default_key"
debug: bool = False
# 实例化时会自动读取环境变量
settings = Settings() # 此时会从 os.environ 中读取 DATABASE_URL, API_KEY, DEBUG
手动加载环境变量
如果不使用 BaseSettings,你需要手动读取:
import os
from pydantic import BaseModel, Field
class Config(BaseModel):
database_url: str = Field(default=os.getenv("DATABASE_URL", "default_url"))
api_key: str = Field(default=os.getenv("API_KEY", "default_key"))
这不是自动的,每次实例化时都会读取当前的环境变量。
注意事项
-
Pydantic v2 已将
BaseSettings分离到独立库:需要额外安装pydantic-settingspip install pydantic-settings
-
环境变量名称匹配规则:
- 默认情况下,环境变量名与字段名 大小写不敏感 匹配
- 可以通过
env_prefix、env_file等配置调整
-
.env文件自动加载:class Settings(BaseSettings): model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8") database_url: str这会让 Pydantic 自动从
.env文件加载环境变量。
| 使用方式 | 是否自动加载 | 需要安装 |
|---|---|---|
普通 BaseModel |
❌ 否 | 不需要 |
BaseSettings(标准方式) |
✅ 是 | pydantic-settings |
手动指定 Field(default=os.getenv(...)) |
❌ 否(但读取了环境变量) | 不需要 |
最佳实践:使用 pydantic-settings 的 BaseSettings 类,它会从环境变量和 .env 文件自动加载。