APSW中SQL参数绑定执行失败咨询:表名用占位符报语法错误
问题原因
- 核心原因是SQL参数绑定不支持传递表名、列名等SQL标识符,仅支持传递普通业务值(比如整数、字符串、日期等)。
SQL语句在执行前需要完成预编译,此时必须确定所有的语法结构(包括操作的表名、涉及的字段名),参数占位符?对应的值是预编译完成后的执行阶段才代入的,不会被解析为SQL语法结构的一部分,因此你用?传递表名stream时,预编译阶段识别到UPDATE ?_pointer不符合SQL语法规范,直接抛出语法错误。 - 额外的语法问题:参数占位符
?只能作为独立的语法元素使用,不能和其他字符串直接拼接成标识符(比如?_pointer这种写法本身就不合法)。
正确实现方案
表名部分通过字符串格式化拼接,业务值部分保留参数绑定即可,既符合语法规则,也能最大程度避免SQL注入风险:
# 【重要提示】如果stream变量来自用户输入/不可信来源,必须先做白名校验,比如if stream not in ('允许的表名1', '允许的表名2'): 抛出错误 sql = f"""UPDATE {stream}_pointer SET id = ?; insert into {stream} VALUES (?,?,?)""" cursor.execute(sql, (message.id, message.id, safemessage, 'pending'))
这个问题和你使用的Chromebook、Jupyter Lab、APSW组件都没有关系,是SQLite本身的语法规则限制。
内容的提问来源于stack exchange,提问作者Andy Thompson
相关产品推荐
相关产品推荐

