【问题标题】:How to eagerly load objects from SqlAlchemy queries?如何从 SqlAlchemy 查询中急切加载对象?
【发布时间】:2014-07-29 16:49:15
【问题描述】:

我尝试在查询中设置几个选项,例如:

session.query(CatalogueEntry)\
        .options(eagerload_all())\
        .filter(CatalogueEntry.source_path.in_(paths)).all()

但我不断收到错误:

...
File "/venv/lib/python2.7/site-packages/sqlalchemy/orm/__init__.py", line 245, in eagerload_all
return joinedload_all(*args, **kwargs)
File "/venv/lib/python2.7/site-packages/sqlalchemy/orm/strategy_options.py", line 665, in joinedload_all
_UnboundLoad.joinedload, keys, True, kw)
File "/venv/lib/python2.7/site-packages/sqlalchemy/orm/strategy_options.py", line 315, in _from_keys
opt = meth(opt, all_tokens[-1], **kw)
IndexError: list index out of range

如果我将其更改为:

session.query(CatalogueEntry)\
        .options(eagerload_all('*'))\
        .filter(CatalogueEntry.source_path.in_(paths)).all()

我明白了:

DetachedInstanceError: Instance <CatalogueEntry at 0x1026936d0> is not bound to a Session; attribute refresh operation cannot proceed

我想将我的对象从会话中分离出来,并将它们传递回只读取属性的客户端代码。在我添加选项之前,我得到了 DetachedInstanceErrors。

如何从 sqlalchemy (0.9.4) 查询返回完全水合的对象,在会话关闭后,我的代码的其他部分可以读取其属性?

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:
    session.query(CatalogueEntry)\
            .options(joinedload('name_of_relationship_attribute'))\
            .filter(CatalogueEntry.source_path.in_(paths)).all()
    

    还有subqueryload

    您也可以在关系定义中使用lazy='joined' 或lazy = 'subquery' 设置默认加载方法

    查看此网址以供参考 http://docs.sqlalchemy.org/en/rel_0_9/orm/loading.html?highlight=joinedload#sqlalchemy.orm.joinedload_all

    【讨论】:

    • 问题是,根本没有任何关系。 CatalogueEntry 表示单个独立表。我只想让这些物体完全水合,这样我就可以在会话之外使用它们。这还能用吗?
    • 我不确定我是否遵循您的意思,然后完全补水。如果没有关系,则没有任何需要预加载的内容,因为预加载的定义是在查询主表时加载其他关系。还有一组选项是 SQLAlchemy,它允许您控制在查询模型时加载表的哪些列,但默认情况下,除非您在模型定义中另有指定,否则您将获得示例中的所有列
    猜你喜欢
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2015-03-12
    相关资源
    最近更新 更多