5

大家好,我遇到了一个错误

OperationalError:(1054,“'where 子句'中的未知列'XX'”)

其中XX是下面代码中CLASS的值

conn = MySQLdb.connect(host = "localhost",user = "user", passwd = "pass",db = "dbase")
cursor = conn.cursor()
cursor.execute("""SELECT * FROM %s WHERE course =%s AND sec = %s""" % (str(DEPT),str(CLASS),str(SEC),))

问题是,我只在某些值下得到这个错误,即当 CLASS 包含一个字母时。如果有帮助,我将表设置为 varchar

谢谢!

4

3 回答 3

6

不要在您的 SQL 中使用“字符串注入”,除非它确实必不可少,例如在str(DEPT)此处选择您要从中选择的表。对于其他所有情况,请改用 Python DB API 的参数传递功能——它会为您正确引用并自动保护您免受“SQL 注入”攻击等。(有时它也可以更快)。

由于 MySQLdb%s对参数使用不幸的表示法,因此您应该这样做(还将样式修复为符合 PEP8,不是必需的,但不会造成伤害;-):

conn = MySQLdb.connect(host="localhost", user="user", passwd="pass", db="dbase")
cursor = conn.cursor()
q = 'SELECT * FROM %s WHERE course=%%s AND sec = %%s""" % (DEPT,)
cursor.execute(q, (CLASS, SEC))

%%生成的字符串格式中的s 在格式化时会q变成一个%,因此q会留下两次出现的%s--用正确格式的和execute的版本整齐地填充。所有的电话都是多余的,等等。CLASSSECstr

顺便说一句,如果您使用的是 Python 2.6 或更高版本,则对于字符串格式化,您应该使用新format方法而不是旧%运算符——这样可以避免您对那些“加倍 % 符号”的需要,以及其他优点。我没有在上面的代码片段中应用这个更改,以防你被 2.5 或更早版本困住(所以上面的代码适用于任何版本的 Python,而不是仅仅适用于最近的版本)。

于 2010-08-11T21:00:16.917 回答
1

代替:

course=%s

我认为你需要:

course='%s'
于 2010-08-11T21:03:37.997 回答
0

我有同样的错误,我只是在我的模型和表中添加了一个新字段,即。标识字段。它工作正常。

于 2018-06-11T05:18:38.690 回答