gpt4 book ai didi

python - 获取 sqlalchemy 基类对象而不是子对象

转载 作者:太空狗 更新时间:2023-10-29 21:57:44 24 4
gpt4 key购买 nike

我的模型中有三个类,其中一个类由另外两个类继承:

class Item(Base):
__tablename__ = 'item'

id = Column(Integer, primary_key=True)
title = Column(Unicode(300))
type = Column(Unicode(50))

__mapper_args__ = {
'polymorphic_on': type
}


class Note(Item):
__tablename__ = 'note'

id = Column(Integer, ForeignKey('item.id'), primary_key=True)
extra = Column(Text)

__mapper_args__ = {
'polymorphic_identity': 'note'
}


class Task(Item):
__tablename__ = 'task'

id = Column(Integer, ForeignKey('item.id'), primary_key=True)
another_extra = Column(Text)

__mapper_args__ = {
'polymorphic_identity': 'task'
}

因此,当我执行 session.query(Item).all() 时,我得到了一个包含 NoteTask 对象的列表,但我不希望这样,我希望我的对象成为 Item 类的实例并且只有 idtitletype,而不是那些额外的字段。我应该如何编写查询?

为了澄清更多,目前,我得到:

[
<models.Note object at 0x7f25ac3ffe80>,
<models.Task object at 0x7f25ac3ffe80>,
<models.Task object at 0x7f25ac3ffe80>,
...
]

但我想得到:

[
<models.Item object at 0x000000000000>,
<models.Item object at 0x000000000000>,
<models.Item object at 0x000000000000>,
...
]

最佳答案

注意:这在多线程应用程序中可能会出现问题。

您可以使用上下文管理器来暂时阻止多态性:

from contextlib import contextmanager
from sqlalchemy import inspect

@contextmanager
def no_poly(class_):
mapper = inspect(class_).mapper
polycol = mapper.polymorphic_on
mapper.polymorphic_on = None
yield class_
mapper.polymorphic_on = polycol

Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)
task = Task(title='Task Title', another_extra='something')
s = Session()
s.add(task)
s.commit()

# opening a new session as if the pk already exists in the
# identity map it will return whatever type that pk is
# pointing at.
s = Session()
with no_poly(Item) as class_:
inst = s.query(class_).all()
print(inst) # [<__main__.Item object at 0x000001443685DDD8>]
s = Session() # new session again.
inst = s.query(Item).all()
print(inst) # [<__main__.Task object at 0x00000144368770B8>]

如果对象的标识已在 Identity Map 中引用,请注意并在我的示例中的注释中指出。 ,那么无论您查询的类是什么,您都会得到其中保存的任何类型。

关于python - 获取 sqlalchemy 基类对象而不是子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53458005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com