使用yield_per
时,如果我想执行另一个查询而又没有全部提取yield_per
查询的结果,则不得不使用单独的会话。
让我们以以下模型为例:
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
children = relationship("Child", backref="parent")
class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parent.id'))
有三种方法可以实现相同的目的,但只有第一种有效:
query = session.query(Parent).yield_per(5)
for p in query:
print(p.id)
# 1: Using a new session (will work):
c = newsession.query(Child).filter_by(parent_id=p.id).first()
print(c.id)
# 2: Using the same session (will not work):
c = session.query(Child).filter_by(parent_id=p.id).first()
print(c.id)
# 3: Using the relationship (will not work):
c = p.children[0]
print(c.id)
确实(使用mysql时)2和3都将引发异常并停止执行,并出现以下错误:“命令不同步;您现在不能运行此命令”。
我的问题是,在这种情况下,有没有办法使关系查找有效?当第一个繁忙时,也许有办法欺骗sqlalchemy使用新的会话吗?
答案 0 :(得分:0)
尝试使用selectinload,因为它支持通过yield_per进行紧急加载。
import sqlalchemy as sa
query = session.query(
Parent
).options(
sa.orm.selectinload(Parent.children)
).yield_per(5)
for parent in query:
for child in parent.children:
print(child.id)