如何让SQLAlchemy的db.session.query返回模型类实例?
问题:如何让
db.session.query()返回模型类实例而非sqlalchemy.util._collections.result对象? 我了解查询数据库至少有两种方式:使用<Model>.query或db.session.query(SomeMappedClass)。测试时发现,前者返回模型类实例,后者返回sqlalchemy.util._collections.result实例。请问如何让第二种查询方式也能像第一种一样返回模型类实例?
测试代码示例:
>>> Widget.query.first() <Widget title='Widget 0' uuid='90eca137-1426-43c7-b5e4-2225de5abd0a' user_id=1 deleted=False> >>> type(_) models.sql_models.Widget >>> db.session.query(table).first() (1, 'Widget 0', '90eca137-1426-43c7-b5e4-2225de5abd0a', 1, False) >>> type(_) sqlalchemy.util._collections.result
回答
这个问题其实很好解决,核心原因是你传给db.session.query()的对象类型不对~
你在示例里用db.session.query(table)时,这里的table应该是模型对应的底层数据库表对象(比如Widget.__table__),而不是模型类本身(Widget)。SQLAlchemy查询表对象时,会返回由字段值组成的tuple-like result对象;而查询模型类时,才会返回对应的模型实例。
想要让db.session.query()返回模型实例,只需要把模型类作为参数传入即可:
>>> db.session.query(Widget).first() <Widget title='Widget 0' uuid='90eca137-1426-43c7-b5e4-2225de5abd0a' user_id=1 deleted=False> >>> type(_) models.sql_models.Widget
补充说明:
<Model>.query本质是SQLAlchemy为模型类提供的快捷查询接口,它默认就是基于模型类本身构建的查询,所以直接返回模型实例。- 如果你的查询需要指定模型的部分字段(比如
db.session.query(Widget.id, Widget.title)),依然会返回result对象——这是因为你只查询了部分字段,无法构建完整的模型实例。如果要返回完整实例,必须直接查询整个模型类。
内容的提问来源于stack exchange,提问作者Christopher Shroba
相关产品推荐
相关产品推荐

