我正在尝试更新表中的任意列:
cursor.execute('update table set :n = :v where submitter = :s',
{'n':'col1', 'v': 10, 's': 'mike'})
但它给了我sqlite3.OperationalError: near ":n": syntax error
。奇怪的是,当我这样做时,它可以正常工作
cursor.execute('update table set col1 = :v where submitter = :s',
{'n':'col1', 'v': 10, 's': 'mike'})
为什么我不能以注入保存的方式命名列?有没有其他方法来设置任意列?
答案 0 :(得分:4)
只能绑定值; 标识符(例如列/表名称)和其他结构语法不能与占位符绑定。
通常,准备好的语句必须具有“已知查询形状”,并允许动态标识符禁止这样做。 (可能有数据库和数据库适配器不适用于此,但我还没有遇到过。)
答案 1 :(得分:2)
正如您所发现的,占位符不能用作表名或列名。相反,您必须在动态表或列名称的字符串中连接。
因此,建议根据可用列名称的白名单进行检查,以确保其安全:
# Array of valid values for colname
valid_colnames = ['col1','col2','col3']
# Only do it if you received a safe known value
if colname in valid_colnames:
cursor.execute('update table set ' + colname + ' = :v where submitter = :s',
{'v': 10, 's': 'mike'})