如何在SQLAlchemy中加载无ORM外键关联的关联表
无预定义关联时SQLAlchemy查询的关联实体访问方案
要实现通过results[0].SOME_KEY.name访问关联的A实体,无需预先在模型中定义relationship,可以通过以下两种方式修改查询:
方式一:给关联实体指定标签别名
直接在查询中同时选择B和A实体,并用label()给A设置自定义别名(即你需要的SOME_KEY),再通过映射结果访问:
import sqlalchemy as sa # 修改查询,同时选择B和带别名的A query = sa.select(B, A.label("a_entity")).join(A, A.id == B.a_id) result = await session.execute(query) # 使用mappings()获取映射式结果,支持通过别名访问 results = result.mappings().all() # 访问关联A实体的name属性 print(results[0].a_entity.name)
方式二:使用实体别名(aliased)
通过sqlalchemy.orm.aliased创建A的别名,在查询中关联该别名实体,同样通过映射结果访问:
import sqlalchemy as sa from sqlalchemy.orm import aliased # 创建A的别名,指定名称为a_entity A_alias = aliased(A, name="a_entity") query = sa.select(B, A_alias).join(A_alias, A_alias.id == B.a_id) result = await session.execute(query) results = result.mappings().all() # 通过别名访问关联实体属性 print(results[0].a_entity.name)
关键说明
- 两种方式都无需修改原有模型定义,完全在查询层实现关联实体的绑定
result.mappings()返回的是ORM映射对象,可直接通过别名(SOME_KEY)访问对应的关联实体- 若需要保留B实体的原生对象结构,也可以通过
result.unique().all()获取元组列表(每个元组为(B实例, A实例)),再自行处理,但映射方式更贴合你需要的属性访问形式
内容的提问来源于stack exchange,提问作者Tolqinbek Isoqov
相关产品推荐
相关产品推荐

