所以我有这段代码:
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
表示正在搜索的是什么,而不是列的名称。有什么建议吗?
答案 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() + "'"