2012-07-25 116 views
1

我很奇怪,爲什麼我收到此錯誤: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

回答

4

你的代碼來創建查詢不是試圖引用字符串值:

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

0

如果斯內德爾德的建議行不通,這裏是一個另類:

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

我面臨一個問題,即我的SQL命令沒有被執行,並遵循這種語法使其工作。

儘管您一定要小心,因爲使用%而不是,可以打開SQL注入的可能性,但這是唯一適用於我的語法。可能是Python-MySQL版本和兼容性問題。

更好的辦法是安裝兼容的版本並遵循正確的語法。

相關問題