2016-11-18 49 views
0

我是一名python初學者,我試圖解析一個CSV文件並將其內容添加到數據庫中。通過Python將CSV轉化爲SQL:傳遞多個參數

我當前的代碼:

with open('fruit.csv', 'rb') as f: 
reader = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE) 
for row in reader: 
    sql = "INSERT INTO fruit(ID,NAME,COLOUR,SIZE) VALUES(?, ?, ?, ?)" 
    try: 
     cursor.execute(sql, [ row[0], row[1], row[2], row[3] ]) 
     db.commit() 
     print('done') 
    except csv.Error as e: 
     print('error: ' + e) 
     db.rollback() 

我現在的錯誤:

Traceback (most recent call last): 
    File "mysqltest.py", line 23, in <module> 
    cursor.execute(sql, (row[0], row[1], row[2], row[3])) 
    File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 187, in execute 
    query = query % tuple([db.literal(item) for item in args]) 
TypeError: not all arguments converted during string formatting 

我在這裏SE閱讀答案很多其他的問題,但我仍然無法理解如何通過幾個值在一行內作爲一個SQL字符串的單獨值。

不知道是否有關,但這是表的我想寫的結構:

TABLE FRUIT (
     ID int primary key NOT NULL, 
      NAME CHAR(20) NOT NULL, 
      COLOUR CHAR(20), 
      SIZE CHAR(20)) 

如果有人能說明什麼我做錯了,這將會是非常讚賞!

+0

嘗試在列表的末尾添加一個逗號。更多,請嘗試與元組而不是列表的列表:) – 2016-11-18 19:20:16

+0

我的方式瞭解它,通過離開?我可以稍後在.execute()調用中傳遞參數,而當我嘗試%s時(不成功),我還嘗試按照您所說的傳遞參數。我只是試着按照你的建議添加.format,然後調整其餘部分,但是我得到了一個ProgrammingError,並被告知要閱讀我附近的語法(?,?,?,?)。 – Nicholas

+0

@ Dex'ter感謝您的回覆。我認爲這是你的意思? vals =(row [0],row [1],row [2],row [3])的數據類型爲「sql =」插入水果(ID,NAME,COLOR,SIZE)VALUES(?,?,?,?) ]) cursor.execute(sql,vals)' – Nicholas

回答

1

在大多數的Python API模塊,MySQL使用%s操作者而不是?

sql = "INSERT INTO fruit(ID, NAME, COLOUR, SIZE) VALUES(%s, %s, %s, %s)" 
try: 
    cursor.execute(sql, [row[0], row[1], row[2], row[3]]) 
+0

謝謝,我在其他問題中發現了這個語法,但我得到了這個結果: 'Traceback(最近調用最後一個): 文件「mysqltest.py」,第23行,在 cursor.execute(sql,[row文件「C:\ Python27 \ lib \ site-packages \ MySQLdb \ cursors.py」,第205行,執行 self.errorhandler [0],row [1],row [2],row [3]]) self.errorhandler (self,exc,value) 錯誤的整數值(1366,「錯誤的整數值:'ID'列'ID'在第1行「)' – Nicholas

+0

現在我明白了,我認爲這是因爲第一行實際上是標題,所以它應該被解析diff erently。如果我忽略它,我會看看它是否有效。 – Nicholas

+1

如果第一行是標題,在'with(...)'語句之後加'next(f)'以跳過它。另外,嘗試轉換爲'int()'。 – Parfait

0

我認爲類型錯誤。因此,你可以嘗試下面的代碼。

使用STR()函數

cursor.execute(sql, [ str(row[0]), str(row[1]), str(row[2]), str(row[3]) ]) 
+0

沒有喜悅我害怕。因爲它是數據庫中的一個int,所以我還試圖離開行[0]。我認爲我的語法錯了,但我不知道如何。 – Nicholas