如何停止SQLAlchemy对原始查询之外的结果进行ORM对象的水化处理?

时间:2019-04-09 13:18:15

标签: python-3.x orm sqlalchemy flask-sqlalchemy

我在使用SQLAlchemy和Flask正确向我的API正确显示数据时遇到麻烦。由于SQLAlchemy延迟加载关系而与查询结果无关,因此输出中的数据比ORM查询中的数据更多。

我汇总了一个查询,该查询选择Classification个对象中的Asset个对象,这些对象通过子查询的Assets / members / children上的关系进行内部联接Classification

我已经检查了我的ORM查询生成的SQL,它是正确的并产生了所需的结果。但是,当我运行代码并检查API输出时,SQLAlchemy选择正确的Classification对象,然后为它们提供所有Assets而不是我精心构建的原始查询中的过滤对象。

如前所述,这似乎是由于延迟加载造成的,不同的加载策略似乎只改变了关系的加载方式,而不改变了加载的内容,关闭延迟加载导致根本不加载。

>

有没有一种方法可以只用查询中的数据填充ORM对象,而不用让它离开并填充所有关系而已?

# Inside Classification class
assets = db.relationship(
    'Asset',
    back_populates='classifications',
    secondary='class_object'
)

# Inside our repository package
query = (
    db.session.query(models.Classification)
)

assets_sub_query = (
    db.session.query(models.Asset)
    .join(models.Organisation, models.User.organisation)
    .join(models.Project, models.Organisation.projects)
    .join(models.Asset, models.Project.assets)
    .filter(models.User.id == user_id)
)

query = query.join(assets_sub_query.subquery(), models.Classification.assets)

理想的结果是返回Classification并仅与我们要加入的子查询中的Assets一起显示。

SQLAlchemy实际上是基于原始关系映射填充assets的,因此它包含了所有内容。

必须有一种方法,我看过非主要的映射器,但是在这种情况下看不到如何将资产映射到查询而不是静态表。

0 个答案:

没有答案