将.xlsx文件加载到MySQL数据库的最快方法

问题描述:

我试图将数据从.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中的自动提交,或者改变您向数据库输入行的确切方式,具体取决于您在现状中所做的操作。 –

如果它处于打开状态,则禁用自动提交!自动提交是一种让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

考虑保存工作簿的工作表为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()