web2py SQLFORM.grid首次加载正常 ajax刷新触发分页SQL语法错误
web2py SQLFORM.grid异步刷新触发MySQL LIMIT -20语法错误解决方案
环境信息
- 部署平台:PythonAnywhere
- 运行环境:Python 3.7 + web2py 2.21.1 + MySQL
- 异常组件:
SQLFORM.grid
异常复现路径
- 首次页面加载时,通过ajax方式加载grid组件运行正常,加载代码如下:
{=LOAD('default', 'video_row_assignments.load', vars={"packageId":packageId,"videoId":videoId,"display_type":"available_seasons","show":"mainPage","calledBy":"video_seasons_div"}, ajax=True)}}
- 手动触发异步刷新更新grid时,返回数据库错误:
Query Not Supported: (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 '-20' at line 1")
- 异常返回的分页链接功能正常:点击分页栏第1页选项可正常加载对应记录,可排除查询语句本身的语法错误。
关联业务代码
grid初始化逻辑如下:
# 基础查询条件 (`seasons`.`id` >= 0) available_seasons = SQLFORM.grid( self.query, fields=[ db.series.id, db.seasons.id, Field.Virtual('videoId', lambda row: self.videoId) ], maxtextlengths={'db.series.id' : 250,'db.seasons.id':250}, left=self.left, deletable=False, editable=False, orderby=self.orderby, details=False, csv=False, field_id=db.seasons.id, selectable=self.selectable, selectable_submit_button='Add Video To Checked Seasons', formname='addSeasons', headers=headers )
根因说明
异常触发逻辑与推测一致:自定义异步刷新请求未携带分页页码参数时,web2py页码解析逻辑默认取到0值,分页偏移量计算公式为(当前页码 - 1) * 单页条数,默认单页20条时计算得到偏移量为-20,最终生成LIMIT -20的非法SQL,触发MySQL语法报错。
首次加载正常是因为框架内置的LOAD组件发起初始请求时会自动补全默认页码参数为1,自定义刷新逻辑未做该参数的补全或兜底处理。
修复方案
任选一种即可:
- 触发异步刷新的请求中主动携带
page=1参数,指定默认加载第一页数据 - 在对应load方法入口增加参数兜底逻辑,对非法页码值做修正,参考代码:
def video_row_assignments(): # 新增页码参数兜底 request.vars.page = max(int(request.vars.page or 1), 1) # 保留原有业务逻辑、grid初始化代码不变 # ...
- 初始化
SQLFORM.grid时显式传入page参数指定默认页码,避免参数缺失时解析到0值。
内容的提问来源于stack exchange,提问作者wshirley
相关产品推荐
相关产品推荐

