SQL代码无法正常执行

时间:2016-03-13 21:28:58

标签: python sql sqlite cursor

所以我有这段代码:

sql1 = "SELECT * FROM CustomerTable WHERE " + variable.get() + " = " + Queryby.get()
print(sql1)

当我运行此代码时,print会输出:

SELECT * FROM CustomerTable WHERE Title = Mr

表明代码在执行时应该有效。但是,当我将print(sql1)更改为cursor.execute(sql1)时,会输出以下错误消息:

sqlite3.OperationalError: no such column: Mr

这对我来说真的很混乱,因为Mr表示正在搜索的是什么,而不是列的名称。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

您需要将Mr'Mr'之类的单个撇号包装起来。这样,SQL将其识别为字符串而不是列。

基本上,你的行应该是:

sql1 = "SELECT * FROM CustomerTable WHERE " + variable.get() + " = '" + Queryby.get() + "'"

如果你想避免所有的加号,你也可以采用不同的格式:

sql1 = "SELECT * FROM CustomerTable WHERE {} = '{}'".format(variable.get(), Queryby.get())

请记住,如果输入是从外部提供的,那么自己格式化字符串可能会导致SQL注入攻击。有关?的格式,请参阅documentation

答案 1 :(得分:0)

像这样动态构造您的查询会在最终执行时打开注入攻击。而是使用参数化查询:

# This is a little extreme...
sql1 = "SELECT * FROM CustomerTable WHERE ? = ?"
cursor.execute(sql1, (variable.get(), Queryby.get()))

这使您无需确保动态元素的正确引用。

答案 2 :(得分:-1)

在“先生”周围添加引号。像:

sql1 = "SELECT * FROM CustomerTable WHERE " + variable.get() + " = '" + Queryby.get() + "'"