【问题标题】:Pydantic Dataclasses with SqlAlchemy Rasies UnmappedInstanceError带有 SqlAlchemy Rasies UnmappedInstanceError 的 Pydantic 数据类
【发布时间】:2020-07-31 18:29:50
【问题描述】:

问题

当使用 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 的基础 Dataclass 不会导致问题。

【问题讨论】:

  • 您找到解决方案或原因了吗?
  • 不,我最终改用了数据类。您可能想查看新的 SQLAlchemy 声明式映射。 docs.sqlalchemy.org/en/14/orm/…

标签: python-3.x sqlalchemy pydantic


【解决方案1】:

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

来自 Pydantic 的创建者:

最好使用ORM模式。

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

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

-- 塞缪尔科尔文

【讨论】:

猜你喜欢
  • 2014-06-23
  • 2019-05-24
  • 2014-08-16
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 2021-04-15
  • 2021-07-08
相关资源
最近更新 更多