Migrieren Sie PostgresDsn.build von pydentic v1 nach pydantic v2Python

Python-Programme
Anonymous
 Migrieren Sie PostgresDsn.build von pydentic v1 nach pydantic v2

Post by Anonymous »

Ich habe eine einfache Config-Klasse aus dem FastAPI-Tutorial. Aber es scheint, als würde die alte Pydantic-Version verwendet. Ich führe meinen Code mit der Pydantic v2-Version aus und erhalte mehrere Fehler. Ich habe fast alle repariert, aber das letzte kann ich noch nicht reparieren. Dies ist Teil des Codes, der nicht funktioniert:

Code: Select all

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)
Das ist der Fehler, den ich erhalte:

Code: Select all

sqlalchemy.exc.ArgumentError: Expected string or URL object, got MultiHostUrl('postgresql://user:password@localhost:5432/database')
Ich überprüfe viele Stellen, kann aber nicht finden, wie ich das beheben kann. Es sieht so aus, als würde die Methode build Daten als MultiHostUrl-Instanz anstelle einer Zeichenfolge an die Methode sqlalchemy create_engine übergeben. Wie soll ich diesen Code ordnungsgemäß migrieren, um Pydantic v2 zu verwenden?
UPDATE
Ich habe dieses Problem behoben, indem ich die Eingabe für SQLALCHEMY_DATABASE_URI: Optional[PostgresDsn] = None in SQLALCHEMY_DATABASE_URI: Optional[str] = None geändert habe.
Weil Pydantic die automatische Konvertierung durchführt Ergebnis aus irgendeinem Grund. Aber ich bin mir nicht sicher, ob dieser Ansatz der richtige ist. Vielleicht gibt es einen besseren Weg, das zu tun?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post