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
将替换为什么?基本上是用引号括起来的文本。带引号的文本是否可以用作列名?不