Python和mySQLdb错误:OperationalError:(1054,“where子句'中的未知列”)

时间:2010-08-11 20:49:40

标签: python mysql mysql-error-1054

嘿所有,我收到了错误

  

操作错误:(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

谢谢!

3 个答案:

答案 0 :(得分: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))

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

顺便说一下,如果您使用的是Python 2.6或更高版本,那么对于字符串格式化,您应该使用新的format方法而不是旧的%运算符 - 这样您就不需要除了其他优点之外,那些“增加了百分号”。我没有在上面的代码片段中应用这个更改,以防您遇到2.5或更早版本(因此上面的代码适用于任何版本的Python,而不仅仅是在最近合适的版本中)。

答案 1 :(得分:1)

而不是:

course=%s

我认为你需要:

course='%s'

答案 2 :(得分:0)

我有同样的错误,我刚刚在我的模型和表格中添加了一个新字段,即。 id字段。它运作正常。