为什么SQLAlchemy Join查询同时返回两张表数据时结果为空?
问题根源
- 关联查询语法错误:你写的
session.query(Persona, LeaderLevel).join(LeaderLevel, Persona.leader_level_id = LeaderLevel.id)中,关联条件用了单等号=(赋值操作),正确的等值判断应该用双等号==。 - 序列化逻辑不兼容:就算修正了语法,
query(Model1, Model2)返回的结果是(Model1实例, Model2实例)格式的元组,大部分JSON序列化工具默认不能直接解析这种结构,所以会输出空对象。 - 你已经在模型中配置了
lazy="joined"的关联backref,Persona实例可以直接通过.leader_level属性拿到关联的LeaderLevel对象,完全不需要手动写多表查询。
解决方案
推荐用更简单的第一种方案:
方案1:直接利用已配置的关联属性
你原来的单表查询已经可以正常返回Persona数据,且会自动加载关联的LeaderLevel对象,只需要在序列化的时候手动补充leader_level字段即可:
# 原查询无需修改 personas = session.query(Persona).all() # 手动组装成你需要的格式 result = [] for p in personas: result.append({ "supporting_sentence": p.supporting_sentence, "tda_group_name": p.tda_group_name, "main_topic_sentence": p.main_topic_sentence, "label": p.label, "id": p.id, # 直接取关联对象的short_name字段 "leader_level": p.leader_level.short_name })
输出的result完全符合你期望的格式。
方案2:修正多表查询语法后手动处理结果
如果需要坚持用双表查询的写法,先修正语法错误,再处理返回的元组:
# 修正关联条件的等号,用双等号做判断 rows = session.query(Persona, LeaderLevel).join(LeaderLevel, Persona.leader_level_id == LeaderLevel.id).all() result = [] for persona, leader_level in rows: result.append({ "supporting_sentence": persona.supporting_sentence, "tda_group_name": persona.tda_group_name, "main_topic_sentence": persona.main_topic_sentence, "label": persona.label, "id": persona.id, "leader_level": leader_level.short_name })
补充说明
如果项目中使用了序列化工具(比如Marshmallow),可以直接在Persona的序列化类中定义字段关联,无需每次手动组装:
from marshmallow import fields, Schema class PersonaSchema(Schema): supporting_sentence = fields.Str() tda_group_name = fields.Int() main_topic_sentence = fields.Str() label = fields.Str() id = fields.Int() # 直接取关联对象的short_name字段 leader_level = fields.Str(attribute="leader_level.short_name") # 使用时直接序列化即可 schema = PersonaSchema(many=True) result = schema.dump(personas)
内容的提问来源于stack exchange,提问作者Kuni
相关产品推荐
相关产品推荐

