Миграция PostgresDsn.build с pydentic v1 на pydantic v2Python

Программы на Python
Ответить
Anonymous
 Миграция PostgresDsn.build с pydentic v1 на pydantic v2

Сообщение Anonymous »

У меня есть простой класс Config из руководства по FastAPI. Но похоже, что он использует старую версию pydantic. Я запускаю свой код с версией pydantic v2 и получаю несколько ошибок. Исправляю почти все, но последнее пока не могу исправить. Эта часть кода не работает:

Код: Выделить всё

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')
Я проверяю много мест, но не могу найти, как это исправить. Похоже, метод build передает данные методу sqlalchemy create_engine как экземпляр MultiHostUrl вместо строки. Как мне правильно перенести этот код для использования pydantic v2?
ОБНОВЛЕНИЕ
Я исправил эту проблему, изменив тип для SQLALCHEMY_DATABASE_URI: Необязательно[PostgresDsn] = Нет на SQLALCHEMY_DATABASE_URI: Необязательно[str] = Нет.
Потому что pydantic делает авто преобразование результата по какой-то причине. Но я не уверен, что этот подход правильный, может быть, есть лучший способ сделать это?

Подробнее здесь: https://stackoverflow.com/questions/771 ... ydantic-v2
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»