首页 > 解决方案 > 带有 SqlAlchemy Rasies UnmappedInstanceError 的 Pydantic 数据类

问题描述

问题

当使用 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 的数据类中的什么导致了这个问题?使用 python 的基本数据类不会导致问题。

标签: python-3.xsqlalchemypydantic

解决方案


这是 Pydantic 和 SQLAlchemy 之间的一个已知问题,无法修复。这个github 问题有更多细节。

来自 Pydantic 的创建者:

最好使用ORM模式。

我对 ORM 没有个人兴趣或支持它们——从长远来看,它们是一个错误,你最好只写 SQL。

但是,如果有一些简单的方法来支持需要对 pydantic 进行相对较小更改的映射器,我很乐意审查 PR。

——塞缪尔科尔文


推荐阅读