Python SQL代码执行不正确
我有一段代码:Python SQL代码执行不正确,python,sql,sqlite,cursor,Python,Sql,Sqlite,Cursor,我有一段代码: sql1 = "SELECT * FROM CustomerTable WHERE " + variable.get() + " = " + Queryby.get() print(sql1) 当我运行此代码时,打印输出: SELECT * FROM CustomerTable WHERE Title = Mr 这表明代码在执行时应该工作。但是,当我将print(sql1)更改为cursor.execute(sql1)时,它会输出以下错误消息: sqlite3.Operati
sql1 = "SELECT * FROM CustomerTable WHERE " + variable.get() + " = " + Queryby.get()
print(sql1)
当我运行此代码时,打印
输出:
SELECT * FROM CustomerTable WHERE Title = Mr
这表明代码在执行时应该工作。但是,当我将print(sql1)
更改为cursor.execute(sql1)
时,它会输出以下错误消息:
sqlite3.OperationalError: no such column: Mr
这对我来说真的很困惑,因为
Mr
的位置表明它是正在搜索的内容,而不是列的名称。有什么建议吗?您需要将Mr
用一个单引号括起来,如so'Mr'
。这样,SQL将其识别为字符串而不是列
基本上,您的产品线应该是:
sql1 = "SELECT * FROM CustomerTable WHERE " + variable.get() + " = '" + Queryby.get() + "'"
如果您希望避免所有加号,也可以采用不同的格式,如:
sql1 = "SELECT * FROM CustomerTable WHERE {} = '{}'".format(variable.get(), Queryby.get())
请记住,如果输入是从外部提供的,那么自己格式化字符串可能会导致SQL注入攻击。请参阅有关使用
?
格式的说明。您需要使用一个单撇号将Mr
包装起来,如so'Mr'
。这样,SQL将其识别为字符串而不是列
基本上,您的产品线应该是:
sql1 = "SELECT * FROM CustomerTable WHERE " + variable.get() + " = '" + Queryby.get() + "'"
如果您希望避免所有加号,也可以采用不同的格式,如:
sql1 = "SELECT * FROM CustomerTable WHERE {} = '{}'".format(variable.get(), Queryby.get())
请记住,如果输入是从外部提供的,那么自己格式化字符串可能会导致SQL注入攻击。请参阅有关格式的说明,其中包含?
在“Mr”周围添加引号。比如:
在“先生”周围加上引号。比如:
像这样动态地构造查询会在最终执行时使您面临注入攻击。相反,请使用参数化查询:
# This is a little extreme...
sql1 = "SELECT * FROM CustomerTable WHERE ? = ?"
cursor.execute(sql1, (variable.get(), Queryby.get()))
这将免除您确保正确引用动态元素的工作。这样动态构造查询,在最终执行时会导致注入攻击。相反,请使用参数化查询:
# This is a little extreme...
sql1 = "SELECT * FROM CustomerTable WHERE ? = ?"
cursor.execute(sql1, (variable.get(), Queryby.get()))
这将免除您确保正确引用动态元素的工作。可能是因为您提倡的代码容易受到SQL注入攻击。我对原始代码进行了尽可能小的更改以使其正常工作。我真的不会称之为“倡导”。。。另外,如果投票人对我鼓吹不安全的编码做法如此关注,那么他/她可能会费心评论这一点,让其他人知道(也可能让我修改甚至删除我的答案)…可能是因为您提倡的代码容易受到SQL注入攻击。我对原始代码进行了尽可能小的更改以使其正常工作。我真的不会称之为“倡导”。。。另外,如果投票人对我鼓吹不安全的编码做法如此关注,那么他/她可能会费心评论这一点,让其他人知道(也可能让我修改甚至删除我的答案)。。。