2014-11-24 105 views
0

我想在Python 2.7中使用MySQLdb插入值到SQL表中的列。該命令將列表插入1列時遇到問題。插入值到SQL列與MySQL-python

我有一個名爲「名」簡單的表如下所示:

+--------+-----------+----------+--------+ 
| nameid | firstname | lastname | TopAdd | 
+--------+-----------+----------+--------+ 
| 1  | Cookie | Monster |  | 
| 2  | Guy  | Smiley |  | 
| 3  | Big  | Bird  |  | 
| 4  | Oscar  | Grouch |  | 
| 5  | Alastair | Cookie |  | 
+--------+-----------+----------+--------+ 

這裏是我創建的表:

CREATE TABLE `name` (
    `nameid` int(11) NOT NULL AUTO_INCREMENT, 
    `firstname` varchar(45) DEFAULT NULL, 
    `lastname` varchar(45) DEFAULT NULL, 
    `TopAdd` varchar(40) NOT NULL, 
    PRIMARY KEY (`nameid`) 
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 

這是我如何填寫表格:

INSERT INTO `test`.`name` 
(`firstname`,`lastname`) 
VALUES 
("Cookie","Monster"), 
("Guy","Smiley"), 
("Big","Bird"), 
("Oscar","Grouch"), 
("Alastair","Cookie"); 

免責聲明:上述MySQL示例的原始來源是here

這裏是我創建了一個名爲TopAdd的新列:

ALTER TABLE name ADD TopAdd VARCHAR(40) NOT NULL 

我現在有,我想插入列TopAdd作爲列的值5個值的列表。這是清單。

vals_list = ['aa','bb','cc','dd','ee'] 

這是我曾嘗試(內環路UPDATE語句):

vals = tuple(vals_list) 
for self.ijk in range (0,len(self.vals)): 
      self.cursor.execute ("UPDATE name SET TopAdd = %s WHERE 'nameid' = %s" % (self.vals[self.ijk],self.ijk+1)) 

我收到以下錯誤信息:

Traceback (most recent call last): 
    File "C:\Python27\mySQLdbClass.py", line 70, in <module> 
    [Finished in 0.2s with exit code 1]main() 
    File "C:\Python27\mySQLdbClass.py", line 66, in main 
    db.mysqlconnect() 
    File "C:\Python27\mySQLdbClass.py", line 22, in mysqlconnect 
    self.cursor.execute ("UPDATE name SET TopAdd = %s WHERE 'nameid' = %s" % (self.vals[self.ijk],self.ijk+1)) 
    File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 205, in execute 
    self.errorhandler(self, exc, value) 
    File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
_mysql_exceptions.OperationalError: (1054, "Unknown column 'aa' in 'field list'") 

是否有插入這些值分成的方式帶有循環的列或直接作爲列表?

+0

你可能想修復這個問題的DDL;如果定義的表沒有「TopAdd」的缺省值,那麼你的INSERT查詢將失敗。由於稍後添加該列,它看起來應該不包含在原始的「CREATE TABLE」語句中。 – Air 2014-12-02 16:38:45

回答

1

試試這個:

vals_list = ['aa','bb','cc','dd','ee'] 
在歷數

爲I,J(vals_list):

self.cursor.execute(("UPDATE test.name SET TopAdd = '%s' WHERE nameid = %s" % (str(j),int(i+1)) 
+0

工作正常!我不明白你的方法如何工作,但我的方法不是。我試過這個:'...%(str(self.vals_list [ijk]),int(ijk + 1)))'但我仍然收到相同的錯誤信息。當我檢查'type()'時,我得到''爲我的方法。使用你的方法,type()給了我相同的結果。如果是這樣,那麼我的方法也應該工作。有什麼我做錯了嗎? – 2014-11-24 17:58:14

+1

您是否在您的代碼中更改了TopAdd ='%s',在您的代碼中是TopAdd =%s – 2014-11-25 13:01:21

+0

謝謝。你的方法好得多。這回答了我的問題。 – 2014-11-27 04:35:08

1

的一個問題是在這裏:

for self.ijk in range (0,len(self.vals)): 

range功能是創建一個列表(可能是列表[0, 1, 2, 3, 4])。在迭代for循環中的集合時,將集合中的每個連續項綁定到一個名稱;您不需要將它們作爲實例的屬性進行訪問。 (在這裏使用xrange也是適當的;參見xrange vs range。)因此self參考是非感性的;除此之外,ijk對於整數值來說是一個糟糕的名字,並且不需要提供默認的初始值零。 KISS

for i in range(len(self.vals)): 

這不僅使你的線短(因此更易於閱讀),使用i表示在一個循環的整數值這遠遠瞭解的約定。現在我們來到了另一個問題:

self.cursor.execute ("UPDATE name SET TopAdd = %s WHERE 'nameid' = %s" % (self.vals[self.ijk],self.ijk+1)) 

你沒有正確這裏參數化查詢。不要遵循this advice,這可能會解決您目前的錯誤,但最糟的是,您的代碼容易浪費調試時間,SQL injection和/或數據完整性問題。相反,用逗號替換%,以便execute函數可以爲您安全地引用和轉義參數。

隨着這種變化,再減去在你列名引號,​​3210:

query = "UPDATE name SET TopAdd = %s WHERE nameid = %s;" 
for i in range(len(self.vals)): 
    self.cursor.execute(query, (self.vals[i], i + 1)) 

應該正常工作。您仍然可以按照其他答案的建議使用enumerate,但是沒有理由繞過所有可見的類型,枚舉是documented,並給出了你已經想要的類型:

for i, val in enumerate(self.vals): 
    self.cursor.execute(query, (val, i + 1)) 
+0

謝謝。儘管我將上面的答案標記爲已接受,但我的最終查詢最終與上面的答案和您的答案非常相似(第二個答案) - 使用'enumerate()'。我發現這種方法比我的理解要直觀得多。另外,感謝您糾正我關於「self()」的使用 - 這是我的一個真正的誤解,我可以簡化代碼的前進。再次感謝。 – 2014-11-27 04:34:35