python操作excel匯入資料到mysql
阿新 • • 發佈:2018-12-30
需求:excel的兌換碼匯入mysql中,總共有30W條資料。Navicat有自帶功能,可以直接將excel的資料匯入到mysql中,資料庫太多,手動操作非常麻煩,使用python寫了一個指令碼。
使用pip匯入xlrd,pymysql庫。
第一版:
import xlrd
import pymysql
import math
# book = xlrd.open_workbook('activity_password1.xlsx')
# sheet = book.sheet_by_name('@activity_password')
filelist = ['activity_password1.xlsx' , 'activity_password2.xlsx', 'activity_password3.xlsx', \
'activity_password4.xlsx', 'activity_password5.xlsx', 'activity_password6.xlsx', \
'activity_password6_1.xlsx', 'activity_password7.xlsx', 'activity_password8.xlsx']
for i in range(1, 100):
# 建立mysql連線
conn = pymysql.connect(
host = '127.0.0.1' ,
user='root',
passwd='123456',
db='youxi' + str(i),
port=3306,
charset='utf8'
)
# 獲得遊標
cur = conn.cursor()
sql = 'insert into gm_password (id, type, code, status) values (%s, %s, %s, %s)'
for filename in filelist:
book = xlrd.open_workbook(filename)
sheet = book.sheet_by_name('@activity_password' )
for r in range(1, sheet.nrows):
values = (sheet.cell(r, 0).value, sheet.cell(r, 1).value, sheet.cell(r, 2).value, sheet.cell(r, 3).value)
cur.execute(sql, values)
conn.commit()
cur.close()
conn.close()
print ('youxi'+str(i)+' sucess')
執行了一下,速度滿的簡直不能忍。並且如果往外網匯入資料,就是超時。進行優化。
優化之後的程式碼:
import xlrd
import pymysql
import math
# book = xlrd.open_workbook('activity_password1.xlsx')
# sheet = book.sheet_by_name('@activity_password')
filelist = ['activity_password1.xlsx', 'activity_password2.xlsx', 'activity_password3.xlsx', \
'activity_password4.xlsx', 'activity_password5.xlsx', 'activity_password6.xlsx', \
'activity_password6_1.xlsx', 'activity_password7.xlsx', 'activity_password8.xlsx']
for i in range(1, 100):
# 建立mysql連線
conn = pymysql.connect(
host = '127.0.0.1',
user='root',
passwd = '123456',
db='youxi' + str(i),
port=3306,
charset='utf8'
)
# 獲得遊標
cur = conn.cursor()
for filename in filelist:
book = xlrd.open_workbook(filename)
sheet = book.sheet_by_name('@activity_password')
ops = []
for r in range(1, sheet.nrows):
values = (sheet.cell(r, 0).value, sheet.cell(r, 1).value, sheet.cell(r, 2).value, sheet.cell(r, 3).value)
ops.append(values)
n = math.ceil(len(ops) / 5000)
for n1 in range(0, n):
cur.executemany('insert into gm_password (id, type, code, status) values (%s, %s, %s, %s)', ops[5000*n1:5000*(n1+1)])
cur.close()
conn.commit()
conn.close()
print ('youxi'+str(i)+' sucess')
優化點總結:
1、批量插入,然後再提交,而不是插一條提交一條。
2、將execute替換為executemany,但是也不要插入太多行,我的設定是5000。
3、不要自己拼接 SQL 語句。直接在executemany方法中執行。
4、減少commit次數,非常重要。
結果:一個數據庫插入需要30s,已經滿足需求,沒有繼續優化,應該還有可以繼續優化的點。