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

时间:2017-06-26 15:06:05

标签: python mysql excel

我试图将.xlsx文件中的数据导入SQL数据库。 现在,我有一个使用openpyxl和MySQLdb模块的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() 

2 个答案:

答案 0 :(得分:0)

如果启用,则禁用自动提交! Autocommit是一个使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()

答案 1 :(得分: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()