【问题标题】:Python and mySQLdb error: OperationalError: (1054, "Unknown column in 'where clause'")Python 和 mySQLdb 错误:OperationalError:(1054,“'where 子句'中的未知列”)
【发布时间】:2010-08-11 20:49:39
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: python mysql mysql-error-1054


    【解决方案1】:

    不要在你的 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的字符串格式中的%%s在格式化时变成一个%,所以q留下了两次%s——execute巧妙地填充使用正确格式的 CLASSSEC 版本。所有str 调用都是多余的,等等。

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

    【讨论】:

    • 对不起,我对 SQL 和 Python 真的很陌生。你能解释一下参数传递是什么,如果它不是太大的问题?谢谢!
    • @Jill,当然,请参阅我刚刚对我的答案所做的编辑——我只是重写了你的代码以使其正确(并且符合 PEP8 的空间去哪里或不去优雅风格,并且通过避免一堆多余的str 调用来提高速度和可读性,但这些只是这里的小问题;-)。
    【解决方案2】:

    代替:

    course=%s
    

    我认为你需要:

    course='%s'
    

    【讨论】:

    • Alex 的答案是更好的方法。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 2016-03-19
      • 1970-01-01
      • 2021-07-22
      • 2020-11-04
      • 1970-01-01
      相关资源
      最近更新 更多