python - 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
) ASROW_NUM
\nFROM product' at line 1") [SQL: 'SELECT product.IDX
ASproduct_IDX
, product.PD_SERIAL
ASproduct_PD_SERIAL
, product.PD_COUNT
ASproduct_PD_COUNT
, /.../ product.UPDATE_TIME
ASproduct_UPDATE_TIME
, row_number() OVER (ORDER BY product.IDX
) ASROW_NUM
\nFROM product'] (Background on this error at: http://sqlalche.me/e/f405)
解决方案
您正在使用 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):
- https://mariadb.com/kb/en/library/row_number/
- https://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html
有一些解决方法,但这些方法很丑陋,并且不是由 SQL Alchemy 自动生成的。
我建议升级您的 MySQL 或 MariaDB 服务器,或者在迭代结果时计算 Python 端的行号。
推荐阅读
- asp.net-core-mvc - 有没有办法我可以接收到我的电子邮件的代码,而不是从 Google Authenticator App 输入它?
- javascript - Leafletjs 自定义坐标
- android - 如何找到可用于通过 USB 与 qcom 调制解调器通信的正确端口?
- vba - 创建标题的脚本
- nuget - 在 Teamcity 源中手动上传 Nuget 包
- chatbot - 多类文本分类无法检测 OutOfBound。(聊天机器人应用的关键问题)
- css - 为什么这个 flex-wrap 孩子会增加父宽度以及如何防止?
- laravel - 如何在“post sayı”列中显示用户的帖子数?
- sed - sed 命令替换文件中的第一个匹配项
- amazon-web-services - 试图将所有流量从 EC2 重定向到容器