Пидантические классы данных с 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.
- Самуэльколвин