SQLAlchemy:在与“辅助”参数的关系上使用“(joined|subquery)load”时出现“不从元素链接”错误

Nei*_*eil 4 python sqlalchemy

我有以下查询,可以在没有配置任何形式的预先加载的情况下找到:

model.DBSession.query(Content)
                .options(
                    joinedload(Content.asset_classes).
                    joinedload(Content.asset_types))
                .filter(Content.id.in_(content_ids))
                .all()
Run Code Online (Sandbox Code Playgroud)

还有这些关系:

    asset_classes = orm.relationship(
        AssetClass,
        backref=orm.backref('content'),
        secondary=content_asset_class_ass_table
    )

    asset_types = orm.relationship(
        AssetType,
        backref=orm.backref('content'),
        secondary=content_asset_type_ass_table
    )
Run Code Online (Sandbox Code Playgroud)

当执行此查询时,会导致以下错误:

  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/strategy_options.py", line 156, in _generate_path
    "link from element '%s'" % (attr, path.entity))
ArgumentError: Attribute 'Content.asset_types' does not
    link from element 'Mapper|AssetClass|asset_classes'
Run Code Online (Sandbox Code Playgroud)

这些是使查询工作的修改:

  1. 当删除整个.options()调用时,它工作正常,并且在引用result.asset_classes或时会延迟执行后续查询result.asset_types

  2. 当仅使用or joinedload(Content.asset_classes) joinedload(Content.asset_types),连接有效,但它不能同时与两者一起工作,并且在joinedload为其他关系属性添加更多语句时类似。

为什么joinedload当单个指令有效时多个指令不起作用?

Nei*_*eil 6

在这种情况下,实例之间的点 ( .)joinedload需要是逗号 ( ,)。

我还被不可连接的 ORM 属性之一误导,但错误消息很糟糕。