2017-06-26 77 views
0

我試圖將數據從.xlsx文件導入到SQL數據庫中。 現在,我有一個使用的openpyxl和MySQLdb的模塊將.xlsx文件加載到MySQL數據庫的最快方法

  • 建立數據庫
  • 打開工作簿的連接的python腳本
  • 搶工作
  • 環通行的中提取我需要的列 並將每條記錄逐個插入到數據庫中

不幸的是,這是很痛苦的緩慢。我正在處理一個龐大的數據集,所以我需要找到一個更快的方式來完成這個任務(最好使用Python)。有任何想法嗎?

wb = openpyxl.load_workbook(filename="file", read_only=True) 
ws = wb['My Worksheet'] 

conn = MySQLdb.connect() 
cursor = conn.cursor() 

cursor.execute("SET autocommit = 0") 

for row in ws.iter_rows(row_offset=1): 
    sql_row = # data i need 
    cursor.execute("INSERT sql_row") 

conn.commit() 
+3

您可以包含當前代碼的示例代碼片段嗎?你使用的是什麼版本的SQL?該解決方案可能會關閉SQL中的自動提交,或者改變您向數據庫輸入行的確切方式,具體取決於您在現狀中所做的操作。 –

回答

0

如果它處於打開狀態,則禁用自動提交!自動提交是一種讓MySQL立即嘗試將數據推送到磁盤的功能。如果只有一個插入,這很好,但這會導致每個插入花費很長時間。相反,您可以將其關閉並嘗試一次插入數據,只有在您運行完所有插入語句後才提交。

像這樣的東西可能會奏效:

con = mysqldb.connect(
        host="your db host", 
        user="your username", 
        passwd="your password", 
        db="your db name" 
       ) 
con.execute("SET autocommit = 0") 
cursor = con.cursor() 
data = # some code to get data from excel 
for datum in data: 
    cursor.execute("your insert statement".format(datum)) 

con.commit() 
con.close() 
+0

謝謝你的幫助。插入有點快,但仍需要幾分鐘才能完成(我的數據集有200000多行)。還有其他建議嗎? – Brinley

+0

你可以請你的原始文章中的代碼?這是我最好的猜測,但如果我們看到你的代碼,可能會有更明顯的東西! –

+0

好的。往上看。 – Brinley

0

考慮保存工作簿的工作表爲CSV,然後使用MySQL的LOAD DATA INFILE。這通常是一個非常快的閱讀。

sql = """LOAD DATA INFILE '/path/to/data.csv' 
     INTO TABLE myTable 
     FIELDS TERMINATED BY ',' 
     OPTIONALLY ENCLOSED BY '\"' 
     LINES TERMINATED BY '\n'""" 

cursor.execute(sql) 
con.commit() 
相關問題