添加row_number()后如何保留SQLAlchemy模型类型?
解决SQLAlchemy查询返回Row而非原始模型实例的问题
要让查询返回你定义的模型类实例(而非sqlalchemy.engine.row.Row),核心是确保你的查询是ORM风格的完整模型查询,而非Core风格的字段/表查询,具体可以按以下方式调整:
如果你用的是SQLAlchemy 1.x版本:
直接使用session.query(你的模型类)来构建查询,比如:from your_models import FooModel # 正确写法:返回FooModel实例列表 results = session.query(FooModel).filter(FooModel.foo_field == "bar").all() for row in results: print(row.foo_field) # 直接通过属性名访问如果你用的是SQLAlchemy 2.0版本:
使用select(你的模型类)配合scalars()方法提取模型实例,避免用execute()直接返回结果集(后者默认返回Row对象):from sqlalchemy import select from your_models import FooModel stmt = select(FooModel).where(FooModel.foo_field == "bar") # 使用scalars()获取模型实例列表 results = session.scalars(stmt).all() for row in results: print(row.foo_field)
常见误区排查
如果你之前的查询返回Row,大概率是以下原因:
- 你查询的是单个/多个字段而非完整模型:比如写了
select(FooModel.foo_field, FooModel.id),这种会返回包含字段值的Row;改成select(FooModel)即可。 - 混用了Core和ORM的查询方式:比如直接用
connection.execute(select(FooModel.__table__)),这种基于表对象的查询会返回Row,换成基于模型类的ORM查询就好。
内容的提问来源于stack exchange,提问作者phoxd
相关产品推荐
相关产品推荐

