在 flask-sqlalchemy 中使用 rank().over() 函数返回 (sqlite3.操作错误)接近"(":语法错误



我正在使用flask-sqlalchemy对PlayerKillData表执行排名查询,该表有4列:ref_id(主键(,kill,all_kill和lvl。具体来说,我想要实现的是在同一lvl上按杀戮对玩家进行排名,并添加一个排名列

#Columns define in Create Table SQL statement and resolved by reflection at runtime
class PlayerKillData(db.Model):
__tablename__ = "player_kill_data"

以下python代码片段是我已经尝试过的,但无论我如何尝试,它总是返回sqlite3。操作错误:

subquery = excDB.db.session.query(
PlayerKillData,
excDB.db.func.rank().over(
order_by = PlayerKillData.kill.desc(),
partition_by = PlayerKillData.lvl).label('RANK')
)
subquery.all()

错误消息打印的 SQL 语句为:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "(": syntax error
[SQL: SELECT player_kill_data.ref_id AS player_kill_data_ref_id, player_kill_data.kill AS player_kill_data_kill, player_kill_data.all_kill AS player_kill_data_all_kill, player_kill_data.lvl AS player_kill_data_lvl, rank() OVER (PARTITION BY player_kill_data.lvl ORDER BY player_kill_data.kill DESC) AS "RANK"
FROM player_kill_data]

我还尝试使用SQLite的Db浏览器直接运行SQL语句,它成功返回了表,没有任何错误。

我对此感到非常困惑,并希望得到任何帮助来解决这个问题。

您的 SQLite 版本可能小于3.25.0

正如这里提到的,并在SQLite的发布历史中得到证实,SQLite自2018-09-15发布的版本3.25.0以来支持窗口函数(RANK(( OVER ...(。

要在python中检查SQLite的版本:

import sqlite3
print(sqlite3.sqlite_version)
# returns '3.22.0' for me

如果许多人使用相同的代码库,并且您希望为其他开发人员提供更明确的错误消息,则可以断言:

assert sqlite3.sqlite_version_info >= (3,25,0), """sqlite3 version must be >= 3.25.0 because that's when it started to support window functions"""

最新更新