可以使用新会话访问sqlalchemy关系吗?

时间:2019-04-04 15:21:07

标签: python mysql sqlalchemy flask-sqlalchemy

使用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使用新的会话吗?

1 个答案:

答案 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)