添加limit()后SQLAlchemy无法识别label生成列报错
解决方案
方法一:直接使用label生成的对象排序(推荐)
不要用text()引用别名,而是将label定义的列存为变量,直接在order_by中使用这些变量。这样SQLAlchemy会自动处理排序逻辑,无论是否添加limit都能正确识别列:
# 先定义label列变量 label_column_one = (Model.date_example == Model.date_example_two).label("label_column_one") label_column_two = (Model.date_example_three < Model.date_example_four).label("label_column_two") label_column_three = (Model.date_example_five > Model.date_example_six).label("label_column_three") # 构建查询 query = self.session.query( Model, label_column_one, label_column_two, label_column_three, ) # 使用变量排序 query = query.order_by( desc(label_column_one), desc(label_column_two), desc(label_column_three), ) # 添加limit执行 result = query.limit(5000).all()
方法二:重复排序表达式(不推荐,冗余)
如果不想修改查询结构,可以在order_by中直接重复label对应的表达式,避免引用别名:
query = query.order_by( desc(Model.date_example == Model.date_example_two), desc(Model.date_example_three < Model.date_example_four), desc(Model.date_example_five > Model.date_example_six), )
问题原因
当添加limit()时,SQLAlchemy会将原查询包装为子查询(类似SELECT * FROM (原查询语句) AS anon_1 ORDER BY label_column_one DESC LIMIT 5000)。MySQL中,外层查询的ORDER BY无法引用子查询SELECT子句中的别名(别名作用域仅限子查询内部),因此抛出“未知列”错误。
而不加limit()时,SQL是直接的SELECT ... ORDER BY 别名结构,MySQL允许在ORDER BY中引用当前SELECT的别名,因此可以正常执行。
内容的提问来源于stack exchange,提问作者Murilo Vargas
相关产品推荐
相关产品推荐

