Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用带有命名占位符的集时出现语法错误_Python_Sqlite - Fatal编程技术网

Python 使用带有命名占位符的集时出现语法错误

Python 使用带有命名占位符的集时出现语法错误,python,sqlite,Python,Sqlite,我试图更新表中的任意列,如下所示: cursor.execute('update table set :n = :v where submitter = :s', {'n':'col1', 'v': 10, 's': 'mike'}) 但是它给了我sqlite3.OperationalError:near“:n”:语法错误。奇怪的是,当我这样做的时候,它工作得很好 cursor.execute('update table set col1 = :v where

我试图更新表中的任意列,如下所示:

cursor.execute('update table set :n = :v where submitter = :s', 
               {'n':'col1', 'v': 10, 's': 'mike'})
但是它给了我
sqlite3.OperationalError:near“:n”:语法错误
。奇怪的是,当我这样做的时候,它工作得很好

cursor.execute('update table set col1 = :v where submitter = :s', 
               {'n':'col1', 'v': 10, 's': 'mike'})
为什么我不能用注入保存的方式命名列?是否有其他方法设置任意列

只能绑定值;标识符(例如列/表名)和其他结构语法不能与占位符绑定

一般来说,一个准备好的语句必须有一个“已知的查询形状”,允许使用动态标识符将禁止这样做。(可能有一些数据库和数据库适配器不支持这一点,但我还没有满足要求。)

只能绑定值;标识符(例如列/表名)和其他结构语法不能与占位符绑定


一般来说,一个准备好的语句必须有一个“已知的查询形状”,允许使用动态标识符将禁止这样做。(可能有一些数据库和数据库适配器不支持这一点,但我还没有遇到。)

正如您所发现的,占位符不能用作表名或列名。相反,您必须为动态表或列名串联一个字符串

因此,建议对照可用列名的白名单进行检查,以确保其安全:

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

正如您所发现的,占位符不能用作表名或列名。相反,您必须为动态表或列名串联一个字符串

因此,建议对照可用列名的白名单进行检查,以确保其安全:

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

不是表示优雅的A+,但碰巧我正在迭代列,所以我想这是可行的。@Shep如果你想了解更多,你可以查询SQLite以查找该表中可用的列名,并在数组中使用这些列名,但这仍然限制了你实际允许修改的列,因此它更容易一些。不是表示优雅的A+,但碰巧我正在迭代列,所以我想这是可行的。@Shep如果你想玩得开心,你可以在SQLite中查询该表中可用的列名,并在数组中使用这些列名,但这仍然限制了您实际允许修改的列,因此更容易一些。在最后的SQL语句中,
:n
将替换为什么?基本上是用引号括起来的文本。带引号的文本是否可以用作列名?否。在最后的SQL语句中,
:n
将替换为什么?基本上是用引号括起来的文本。带引号的文本是否可以用作列名?不