首页 > 解决方案 > how to set row number with in sqlAlchemy

问题描述

want to return row with a row number, not IDX.

with in python 3.6.5 SQLAlchemy==1.2.15 aws rds

query = session.query(product)
row_number_column = func.row_number().over(order_by='IDX').label('row_num')
query = query.add_column(row_number_column)

when run query.all() return syntax err.

sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(ORDER BY product.IDX) AS ROW_NUM \nFROM product' at line 1") [SQL: 'SELECT product.IDX AS product_IDX, product.PD_SERIAL AS product_PD_SERIAL, product.PD_COUNT AS product_PD_COUNT, /.../ product.UPDATE_TIME AS product_UPDATE_TIME, row_number() OVER (ORDER BY product.IDX) AS ROW_NUM \nFROM product'] (Background on this error at: http://sqlalche.me/e/f405)

标签: pythonmysqlsqlsqlalchemy

解决方案


您正在使用 MySQL 版本中不存在的数据库功能。

“无效”的 SQL 部分是:

row_number() OVER (ORDER BY product.IDX) AS ROW_NUM

这实际上是使用所谓“窗口函数”的正确 SQL 代码,其中row_number()非常简单。这些在 PostgreSQL、SQL Server、Oracle 和几乎所有其他数据库中都是众所周知的。MySQL 最近加入了 MySQL 8.0 (resp. MariaDB 10.2):

有一些解决方法,但这些方法很丑陋,并且不是由 SQL Alchemy 自动生成的。

我建议升级您的 MySQL 或 MariaDB 服务器,或者在迭代结果时计算 Python 端的行号。


推荐阅读