2015-06-19 72 views
0

我的代碼試圖通過字典,「dbMap」進行迭代,並執行MySQL的INSERT INTO基於dbMAP的鍵和值聲明:Python的MySQLdb的「INSERT INTO」問題

for key in dbMap: 
    try: 
     cursor.execute("INSERT INTO '%s' (id, additional_details) VALUES (123, '%s')", (key, dbMap[key])) 
    except UnicodeEncodeError: 
     pass 

我收到以下錯誤,當我運行上面的代碼:

_mysql_exceptions.ProgrammingError:(1064,「你在你的SQL語法中有錯誤;檢查與你的MySQL服務器版本相對應的手冊,以便在'''random_key'附近使用正確的語法(id,additional_details)VALUES(123,'random_value'at line 1「)

我看不出有什麼MySQL的語法,我違反了,我下面下面的資源幫助:

http://www.mikusa.com/python-mysql-docs/query.html

http://www.w3schools.com/sql/sql_insert.asp

更新:當我試試這個:

for key in dbMap: 
    try: 
     cursor.execute("INSERT INTO {} (id, additional_details) VALUES (123, '{}')".format(key, dbMap[key])) 
    except UnicodeEncodeError: 
     pass 

我得到一個不同的錯誤:

_mysql_exceptions.OperationalError:(1054,「Unknown column'id'在「字段列表」「)

更新2:

for key in dbMap: 
    try: 
     query = "INSERT INTO `%s` (id, additional_details) VALUES(123, %%s)" % key 
     cursor.execute(query, dbMap[key]) 
    except UnicodeEncodeError: 
     pass 

得到了一個新的錯誤:類型錯誤:不串中轉換的所有參數格式

任何援助,幫助我弄清楚什麼錯是非常感謝

+2

您可以使用周圍的表名的單引號?我只使用反引號。 https://dev.mysql.com/doc/refman/5.0/en/identifiers.html(ctrl + f「標識符引號字符」) –

回答

0

當使用Python的MySQL庫時,我認爲你不想在變量周圍使用'。我相信他們使%s從字面上解釋,而不是被替換。已經有一段時間了,因爲我已經使用了這種方法,所以我可能不在基地。試試這個:

try: 
    cursor.execute("INSERT INTO %s (id, additional_details) VALUES (123, %s)", (key, dbMap[key])) 

Python會爲你替換。

此外,考慮使用抽象來防止SQL注入。退房 - this post - SO最常看的一個。

另外,由於我正在仔細查看您的Python行以及您的實際錯誤,因此我認爲您的行不會執行您的想法。

for key in dbMap會產生dbMap的值,而不是鍵值 - 所以,當你調用dbMap[key],因爲key是不是一個索引,它得到一個錯誤。這也可能意味着你沒有通過INSERT INTO key找到正確的桌子。食物的思想。嘗試:

for idx, value in enumerate(dbMap): 
    cursor.execute("INSERT INTO %s (id, additional_details) VALUES (123, %s)", (idx, dbMap[idx])) 

這將允許您訪問的關鍵指標(idx)和mapDB值。

+0

不幸的是刪除單引號沒有辦法。我會研究SQL注入的替代方法,謝謝 –

0

我剛剛跳過一個解釋器來玩這個,看起來你不能在MySQLdb API中替換一個表名,因爲它會把你的替換放在引號中(表名可以被提取但未被引用),所以你必須分兩步做。冰山也是正確的,你不提供你自己的報價。

我的示例:

>>> query = "INSERT INTO %s (id, login) VALUES (1972, %%s)" % 'users' 
>>> cursor.execute(query, ('TEST-LOGIN123',)) 
>>> 1L 

嘗試

for key in dbMap: 
    try: 
     query = "INSERT INTO `%s` (id, additional_details) VALUES (123, %%s)" % key 
     cursor.execute(query, (dbMap[key],)) 
    except UnicodeEncodeError: 
     pass 
+0

我嘗試了這2步方法,並且我得到了TypeError,不知道發生了什麼。我將其包含在問題更新 –

+0

@BlytheSimmons「dbMap [key]」中的內容是什麼?是否有任何內容元組?你有一個要替換的%s,但是如果你通過一個長度大於1的元組來替換多個值,你會看到「TypeError:在字符串格式化過程中並不是所有的參數都被轉換了」 – Jmills

+0

我返回了類型每個值,並且它返回: