Код: Выделить всё
from pydantic import AnyHttpUrl, HttpUrl, PostgresDsn, field_validator
from pydantic_settings import BaseSettings
from pydantic_core.core_schema import FieldValidationInfo
load_dotenv()
class Settings(BaseSettings):
...
POSTGRES_SERVER: str = 'localhost:5432'
POSTGRES_USER: str = os.getenv('POSTGRES_USER')
POSTGRES_PASSWORD: str = os.getenv('POSTGRES_PASSWORD')
POSTGRES_DB: str = os.getenv('POSTGRES_DB')
SQLALCHEMY_DATABASE_URI: Optional[PostgresDsn] = None
@field_validator("SQLALCHEMY_DATABASE_URI", mode='before')
@classmethod
def assemble_db_connection(cls, v: Optional[str], info: FieldValidationInfo) -> Any:
if isinstance(v, str):
return v
postgres_dsn = PostgresDsn.build(
scheme="postgresql",
username=info.data.get("POSTGRES_USER"),
password=info.data.get("POSTGRES_PASSWORD"),
host=info.data.get("POSTGRES_SERVER"),
path=f"{info.data.get('POSTGRES_DB') or ''}",
)
return str(postgres_dsn)
Код: Выделить всё
sqlalchemy.exc.ArgumentError: Expected string or URL object, got MultiHostUrl('postgresql://user:password@localhost:5432/database')
ОБНОВЛЕНИЕ
Я исправил эту проблему, изменив тип для SQLALCHEMY_DATABASE_URI: Необязательно[PostgresDsn] = Нет на SQLALCHEMY_DATABASE_URI: Необязательно[str] = Нет.
Потому что pydantic делает авто преобразование результата по какой-то причине. Но я не уверен, что этот подход правильный, может быть, есть лучший способ сделать это?
Подробнее здесь: https://stackoverflow.com/questions/771 ... ydantic-v2
Мобильная версия