SQLAlchemy查询仅选择指定列时正常,查询全表仅返回模型对象问题
问题原因
你遇到的不是运行异常,是SQLAlchemy 1.4+ ORM查询的默认返回行为:
- 当
select()的参数是完整ORM模型类时,session.execute()返回的每一行是Row类型对象,你取i[0]得到的就是对应的MHICalculation ORM实例。直接打印该实例会显示内存地址,但实际可以通过实例.字段名的方式正常读取所有字段值,也支持后续的ORM更新、关联查询等操作。 - 当你指定单个列作为
select()参数时,Row对象的第一个元素就是该字段的原生值(比如数字、字符串),所以你取i[0]能直接拿到可读取的结果,这也是符合预期的行为。
修复方案
根据你的使用场景选择对应写法即可:
场景1:需要保留ORM实例做后续数据库操作
直接使用scalars()方法简化提取ORM实例,不需要手动遍历取i[0]:
def get_not_tested_calculations(self, location_id: int): with self.session.begin() as sess: sel = select(MHICalculation).filter( MHICalculation.applicable_location == location_id, MHICalculation.is_tested == False ) # scalars()会自动提取每行的第一个元素,也就是ORM实例 res = sess.scalars(sel).all() # 后续读取字段直接使用 实例.字段名 即可,比如 res[0].id、res[0].mhi_type return res
场景2:只需要纯字段字典,不需要ORM实例
直接查询表对象,再用_asdict()方法把每行结果转成字段名和值对应的字典:
def get_not_tested_calculations(self, location_id: int): with self.session.begin() as sess: # 传入表对象而非ORM类,返回结果是纯字段行 sel = select(MHICalculation.__table__).filter( MHICalculation.applicable_location == location_id, MHICalculation.is_tested == False ) # _asdict()直接把行转成有序字典,键为字段名,值为数据库返回值 res = [row._asdict() for row in sess.execute(sel).all()] return res
内容的提问来源于stack exchange,提问作者NotAName
相关产品推荐
相关产品推荐

