2017-04-18 19 views
2

我是Python的新手,所以我一直在從我發現的腳本中一直剽竊腳本,它一直進行得很順利(即使腳本不是最優雅的或正確)。我的最終目標是獲取一個csv,讀取它,找到一個階段,然後如果發現該短語,將該行寫入SQL數據庫。我有這個工作,但我的問題是這樣的:Python SQL單一提交與多個提交與

我應該寫.execute()然後.commit()with(這正是我現在正在做的)的每個循環內?或者我應該建立一個單一的聲明,並在最後執行/提交(不確定如何執行此操作)?我通過this post閱讀,我看到如何格式化插入,但不知道如何把我的代碼(如下),並調整建立一個單一插入與多個值。任何幫助或建議是第一種方法很好或正確的方法是第二種方法將是偉大的!提前致謝!

背景:我正在使用pypyodbc和一個虛擬機。 python腳本與SQL Express數據庫位於同一個虛擬機上。

這裏是我的代碼:

with open(CSVFILE, 'rt', encoding='utf8') as f: 
    if debug: 
     print('Inside the with') 
    reader = csv.reader(f, delimiter=',') 
    columns = next(reader) 
    query = 'insert into TABLENAME ({0}) values ({1})' 
    query = query.format(','.join(columns), ','.join('?' * len(columns))) 
    for row in reader: 
     for field in row: 
      if data.strSearch in field: 
       if debug: 
        print('Found: {}'.format(row[0])) 
       cursor.execute(query, row) 
       cursor.commit() 
+0

您可以將每個循環中感興趣的每個「行」追加到另一個列表中,以給出一個嵌套列表。一旦你完成了所有的循環,你可以調用'executemany()'並且傳遞list_of_rows而不是'execute()'來一次插入記錄,然後'commit()'更改。但是,在內部循環的每次迭代中都使用'commit(),因爲現在不是必須的,並且會增加運行時間。 – roganjosh

回答

1

你正在做它看起來不錯的樣子,但是你可以移動.commit()之外循環的,所以你只能做一個承諾,在年底。這可能會快一點。

至於將行添加到列表然後使用.executemany的建議,該方法幾乎總是導致無論如何將單獨的INSERT語句發送到服務器,因此它可能不會提高性能,而只是移動提交在循環之外。