Пидантические классы данных с SqlAlchemy Rasies UnmappedInstanceError

Проблема

При использовании класса данных pydantic сопоставитель sqlalchemy дает UnmappedInstanceError.

Реализация

# Create a simple user pydantic dataclass
from pydantic.dataclasses import dataclass

@dataclass
class User:
    full_name: str
    email: str

# Map sqlalchemy to the model above
import sqlalchemy as sa
from sqlalchemy.orm import mapper
import model

metadata = sa.MetaData()

user = sa.Table(
    'user', metadata,
    sa.Column("id", sa.Integer(), nullable=False, primary_key=True, autoincrement=True),
    sa.Column("full_name", sa.String(), nullable=True),
)

user_mapper = mapper(model.User, user)

# Create Sqlalchemy session
from sqlalchemy.orm import sessionmaker

engine = create_engine(database_uri)
Session = sessionmaker(bind=engine)
session = Session()

# adding user from above into the session
user = User(full_name='Hey You', email='who@me.com')
session.add(user)
session.commit()

ошибка

sqlalchemy.orm.exc.UnmappedInstanceError: Класс "Пользователь" сопоставлен, но этому экземпляру не хватает инструментовки. Это происходит, когда экземпляр создается до вызова sqlalchemy.orm.mapper(User).

Что в классе данных pydantic вызывает эту проблему? Использование базового класса Dataclass python не вызывает проблем.

1 ответ

Это известная проблема между Pydantic и SQLAlchemy, которая не будет исправлена. Эта проблема с github содержит более подробную информацию.

От создателя Pydantic:

Лучше использовать режим ORM.

У меня нет личного интереса к ORM или их поддержке - в долгосрочной перспективе это ошибка, вам лучше просто написать SQL.

Однако, если есть какой-то простой способ поддержки картографа, который потребовал относительно небольших изменений в pydantic, я был бы рад просмотреть PR.

- Самуэльколвин

Другие вопросы по тегам