2010-08-11 93 views
3

嘿,我得到一个错误Python和MySQLdb的错误:OperationalError:(1054, “在 'where子句' 未知列”)

OperationalError: (1054, "Unknown column 'XX' in 'where clause'")

其中xx是在下面的代码类的Value

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

不要在你的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-- executeCLASSSEC正确格式化的版本整齐地填充。所有str电话是多余的,等

顺便说一句,如果你对Python的2.6或更高版本,用于字符串格式化你应该使用新的format方法,而不是老%运营商 - 您节省从除了其他优势之外,还需要那些“加倍%符号”。我还没有在上面的代码片段中应用这个改变,以防万一你停留在2.5或更早的版本(所以上面的代码可以在任何版本的Python中工作,而不是仅仅在最近的代码中)。

+0

很抱歉,但我真的很新的SQL和Python。你能解释一下,如果这个参数不是太大,你可以解释一下传递的参数吗 谢谢! – 2010-08-11 21:05:14

+0

谢谢亚历克斯!欣赏它 – 2010-08-11 21:07:50

+0

@Jill,当然,请参阅我刚才对我的回答所做的修改 - 我简单地重写了代码以使其正确(并且符合PEP8标准,以确定空间何处去或哪里不适合优雅的风格,并且更快捷并通过避免一堆冗余的“str”调用来读取,但这些只是侧面的问题;-)。 – 2010-08-11 21:08:02

1

相反的:

course=%s 

我想你需要:

course='%s' 
+1

亚历克斯的答案是更好的方法。 – Shane 2010-08-11 21:05:42

+0

不,我得到一个关于正确语法的错误:/ – 2010-08-11 21:06:23

相关问题