SQLite查询在DBeaver正常但Python中报语法错误原因排查
问题根因
你遇到的语法错误是SQLite版本对窗口函数的支持差异导致的:
- SQLite 从
3.25.0版本才正式支持窗口函数(即你查询里用到的row_number() OVER (...)语法) - 你出错的Ubuntu环境是SQLite v3.22.0,版本低于3.25.0,无法识别
OVER关键字后的括号结构,就会抛出near "(": syntax error的报错 - 正常运行的DBeaver环境是v3.36.0,远高于最低支持版本,所以能正常执行
- 你之前认为次版本不会引入破坏性变更的判断是正确的:窗口函数属于新增功能,不属于破坏性变更,只是旧版本不支持新语法而已。
可选修复方案
- 升级Ubuntu环境的SQLite版本到3.25.0及以上
- 改写查询逻辑,把窗口函数实现的分组排序逻辑替换为旧版本兼容的写法:比如用关联子查询、临时表加分组统计的方式实现同等的
row_number()效果 - Python环境下可以安装
pysqlite3第三方包,替换系统内置的旧版本sqlite3,无需升级系统SQLite即可使用新版本特性
内容的提问来源于stack exchange,提问作者Nik
相关产品推荐
相关产品推荐

