Pydantic 数据类与 SqlAlchemy Rasies UnmappedInstanceError
Pydantic Dataclasses with SqlAlchemy Rasies UnmappedInstanceError
问题
当使用 pydantic 的数据时class class 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: Class 'User' is mapped, but this instance lacks instrumentation. This occurs when the instance is created before sqlalchemy.orm.mapper(User) was called.
pydantic 的数据class 是什么导致了这个问题?使用 python 的基础数据 class 不会导致问题。
这是 Pydantic 和 SQLAlchemy 之间的一个已知问题,不会被修复。这个 github issue 有更多的细节。
来自 Pydantic 的创建者:
Best to use ORM mode.
I have no personal interest in ORMs or supporting them - long term they're a mistake, you'd do much better to just write SQL.
However if there's some easy way to support mapper that required a relatively small change to pydantic, I'd be happy to review a PR.
-- samuelcolvin
问题
当使用 pydantic 的数据时class class 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: Class 'User' is mapped, but this instance lacks instrumentation. This occurs when the instance is created before sqlalchemy.orm.mapper(User) was called.
pydantic 的数据class 是什么导致了这个问题?使用 python 的基础数据 class 不会导致问题。
这是 Pydantic 和 SQLAlchemy 之间的一个已知问题,不会被修复。这个 github issue 有更多的细节。
来自 Pydantic 的创建者:
Best to use ORM mode.
I have no personal interest in ORMs or supporting them - long term they're a mistake, you'd do much better to just write SQL.
However if there's some easy way to support mapper that required a relatively small change to pydantic, I'd be happy to review a PR.
-- samuelcolvin