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

2024-01-24

大家好,我收到一个错误

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

Thanks!


不要在 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))

The %%字符串格式中的 s 会产生q成为单身%每个格式化后,所以q留下两次出现%s——其中execute整齐地填写格式正确的版本CLASS and SEC。一切str调用是多余的等等。

顺便说一句,如果您使用的是 Python 2.6 或更高版本,对于字符串格式,您应该使用新的format方法代替旧方法%运算符——这使您不再需要那些“双倍%符号”,还有其他优点。我没有在上面的代码片段中应用该更改,以防万一您坚持使用 2.5 或更早版本(因此上面的代码适用于任何版本的 Python,而不仅仅是最近的版本)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 和 mySQLdb 错误:OperationalError: (1054,“‘where 子句’中的未知列”) 的相关文章

随机推荐