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