Python的MySQLdb的错误 - 是什么原因造成这种

问题描述:

我很奇怪,为什么我收到此错误:Python的MySQLdb的错误 - 是什么原因造成这种

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命令。

+0

您没有显示实际的例外情况。 – 2012-07-25 03:35:57

你的代码来创建查询不是试图引用字符串值:

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) 
) 
+0

当我引用类别值时,一切正常。我不知道插入SQL时需要引用哪些字符串。我将为未来记住这一点。我仍然试图在数据库设计/功能方面取得惊人的进展(我的同事建议我在正常形式下阅读) – 2012-07-25 03:38:19

如果斯内德尔德的建议行不通,这里是一个另类:

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

我面临一个问题,即我的SQL命令没有被执行,并遵循这种语法使其工作。

尽管您一定要小心,因为使用%而不是,可以打开SQL注入的可能性,但这是唯一适用于我的语法。可能是Python-MySQL版本和兼容性问题。

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