所以,我尝试使用 FastAPI 设置 Alembic,但 Pydantic 的 BaseSettings 出现问题,我收到验证错误(未找到变量),因为它找不到 .env 文件(?)
可以通过将
env_file = ".env"
env_file = "../.env"
中的 BaseSettings
更改为 class Config
来解决,但这会在运行 main.py 时发生错误,我尝试使用 env_file = os.path.abspath("../../.env")
将其设置为绝对路径,但这不起作用.
我该怎么办?
配置.py:
import os
from functools import lru_cache
from pydantic_settings import BaseSettings
abs_path_env = os.path.abspath("../../.env")
class Settings(BaseSettings):
APP_NAME: str = "AppName"
SQLALCHEMY_URL: str
ENVIRONMENT: str
class Config:
env_file = ".env" # Works with uvicorn run command from my-app/project/
# env_file = "../.env" Works with alembic command from my-app/alembic
# env_file = abs_path_env
@lru_cache()
def get_settings():
return Settings()
项目文件夹:
my-app
├── alembic
│ ├── versions
│ ├── alembic.ini
│ ├── env.py
│ ├── README
│ └── script.py.mako
├── project
│ ├── core
│ │ ├── __init__.py
│ │ └── config.py
│ └── __init__.py
├── __init__.py
├── .env
└── main.py
在
pydantic 2.4.2
这对我有用:
config.py
from pydantic_settings import BaseSettings, SettingsConfigDict
from dotenv import find_dotenv, load_dotenv
load_dotenv(find_dotenv(".env"))
class Config(BaseSettings):
...
model_config = SettingsConfigDict(case_sensitive=True)
我必须将
python-dotenv
的 load_env
和 find_dotenv
结合起来。
.env
文件位于 config.py
的父目录中。