Flask-SQLAlchemy使用select()生成物化视图SQL报TypeError
报错原因
- 代码存在笔误:导入语句末尾多了无效逗号
from sqlalchemy.sql import select, join,,虽然Python不会直接抛出语法错误,但会干扰模块导入的解析逻辑。 - 核心调用逻辑错误:原生SQLAlchemy的
select()函数默认期望接收可迭代的表对象、列对象集合作为参数,直接传入Flask-SQLAlchemy的模型类Meta时,函数会尝试迭代这个类对象,但Flask-SQLAlchemy的模型类由DefaultMeta元类构造,本身不支持迭代,因此触发TypeError: 'DefaultMeta' object is not iterable报错。
修复方案
根据使用的Flask-SQLAlchemy版本选择对应写法即可,两种写法都能生成等价于SELECT * FROM meta的SQL语句:
全版本通用写法
传入模型类绑定的底层Table实例,不依赖SQLAlchemy版本特性,兼容所有发行版:
@app.route("/test", methods=["GET"]) def test(): from sqlalchemy.sql import select # 移除导入语句末尾的多余逗号,传入模型对应的__table__属性 foo = select(Meta.__table__) return str(foo)
执行后输出的SQL如下,和SELECT * FROM meta查询效果完全一致:
SELECT meta.id, meta.my_col FROM meta
高版本简化写法
如果使用Flask-SQLAlchemy 3.x + SQLAlchemy 2.0+ 版本,可以直接使用框架封装的db.select(),原生支持直接传入模型类,不需要额外调用__table__属性:
@app.route("/test", methods=["GET"]) def test(): foo = db.select(Meta) return str(foo)
如果需要实际执行查询获取结果,直接调用db.session.execute(foo).scalars().all()即可。
内容的提问来源于stack exchange,提问作者spitfiredd
相关产品推荐
相关产品推荐

