Python MySQLdb错误 - 是啥导致了这个

Posted

技术标签:

【中文标题】Python MySQLdb错误 - 是啥导致了这个【英文标题】:Python MySQLdb error - what is causing thisPython MySQLdb错误 - 是什么导致了这个 【发布时间】:2012-07-25 03:31:38 【问题描述】:

我想知道为什么会收到此错误:

cmd = "INSERT INTO resulttest (category, value, timestamp) VALUES (" + key + ", " + str(value) + ", " + str(timestamp) + ")"
c.execute(cmd)
db.commit()

    INSERT INTO resulttest (category, value, timestamp) VALUES (composed, 2, 1343186948.8)

Traceback (most recent call last):
  File "C:/Behavioral Technology/Google Drive/twitterthingv5test.py", line 94, in <module>
    moodParser()
  File "C:/Behavioral Technology/Google Drive/twitterthingv5test.py", line 92, in moodParser
    query()
  File "C:/Behavioral Technology/Google Drive/twitterthingv5test.py", line 37, in query
    main(columns)
  File "C:/Behavioral Technology/Google Drive/twitterthingv5test.py", line 81, in main
    c.execute(cmd)
  File "C:\Python27\lib\site-packages\mysqldb\cursors.py", line 174, in execute
    self.errorhandler(self, exc, value)
  File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue

我相信这与我将值传递给 SQL 命令的方式有关。

【问题讨论】:

您没有显示实际的异常。 【参考方案1】:

您创建查询的代码没有尝试引用字符串值:

cmd = "INSERT INTO resulttest (category, value, timestamp) VALUES (" + key + ", " + str(value) + ", " + str(timestamp) + ")"

看看你打印的SQL语句:

INSERT INTO resulttest (category, value, timestamp) VALUES (composed, 2, 1343186948.8)

不应该引用“类别”吗?

首先,您不应该使用字符串操作来编写 SQL 语句。这就是 SQL 注入漏洞发生的方式。相反,您应该使用占位符并让 MySQL 库处理它们:

c.execute(
    "INSERT INTO resulttest (category, value, timestamp) VALUES (?, ?, ?)", 
    (key, value, timestamp)
)

【讨论】:

当我引用类别值时,一切正常。我不知道插入 SQL 时需要引用字符串。我会记住这一点,以备不时之需。我仍在努力在数据库设计/功能方面取得惊人的成绩(我的同事建议我阅读普通表格)【参考方案2】:

如果 Ned Batchelder 的建议不起作用,这里有一个替代方案:

sql = "INSERT into resulttest (category, value, timestamp) VALUES (%s, %s, %s)"
c.execute(sql % (key, value, timestamp))

我遇到了一个问题,我的 SQL 命令没有被执行,并且遵循这种语法使其工作。

虽然你必须小心,因为使用% 而不是, 会打开SQL 注入的可能性,但这是唯一对我有用的语法。可能是 Python-MySQL 版本和兼容性问题。

更好的办法是安装兼容版本并遵循正确的语法。

【讨论】:

以上是关于Python MySQLdb错误 - 是啥导致了这个的主要内容,如果未能解决你的问题,请参考以下文章

python 出现这个错误是啥原因

MySQLdb for Mac安装报错及问题解决

Python - Mysqldb 安装错误 [错误:命令错误退出状态为 1:]

python 出现这个错误是啥原因

Ubuntu中的Python-MySQLdb错误

Python 导入 MySQLdb 错误 - Mac 10.6