You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 15:39:16