Python和mySQLdb错误:OperationalError:(1054,“where子句中未知列”)
大家好,我遇到了一个错误
操作错误: (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
我也遇到过同样的错误,我只是给我的模型和表里加了一个新的字段,也就是id字段。现在一切都正常了。
1
不要这样写:
course=%s
我觉得你应该这样写:
course='%s'
7
除了在确实必要的情况下,比如这里的 str(DEPT)
用来选择你要查询的表之外,不要在你的SQL中使用“字符串注入”。在其他情况下,应该使用Python数据库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
会用正确格式的 CLASS
和 SEC
来填充它们。所有的 str
调用都是多余的等等。
顺便说一下,如果你使用的是Python 2.6或更高版本,进行字符串格式化时应该使用新的 format
方法,而不是旧的 %
操作符——这样可以避免使用那些“重复的%符号”,还有其他一些好处。我没有在上面的代码片段中应用这个变化,以防你还在使用2.5或更早的版本(所以上面的代码在任何版本的Python中都能工作,而不仅仅是较新的版本)。