使用带有命名占位符的SET语法错误

时间:2012-07-15 18:19:39

标签: python sqlite

我正在尝试更新表中的任意列:

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'})

为什么我不能以注入保存的方式命名列?有没有其他方法来设置任意列?

2 个答案:

答案 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'})
相关问题