1. 程式人生 > >python操作excel匯入資料到mysql

python操作excel匯入資料到mysql

需求: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(1100):
    # 建立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,已經滿足需求,沒有繼續優化,應該還有可以繼續優化的點。