1. 程式人生 > >使用load data方式將xlsx表格百萬行檔案快速匯入mysql中

使用load data方式將xlsx表格百萬行檔案快速匯入mysql中

目錄

一、需求

二、解決方法

三、三種方式的實現

python指令碼

load data命令

四、三種方式效率比較

五、總結


我是同時使用Navicat和mysql-front作為視覺化介面的,各有優缺點。如front可以方便的新建表格、管理表格列等細節。navicat匯入時可選更多格式檔案,front不能匯入xlsx格式檔案。front一次也只能匯入65535行,而navicat可以一次全部匯入。在查看錶格時navicat可分成1000條資料一頁進行檢視。因此,用navicat匯入百萬級xlsx格式檔案比較合適,也比較簡單,但是這種方式極容易使電腦卡死,完全不能做其他工作。

  • python指令碼

原始碼如下:

#!/usr/bin.python
# -*- coding: UTF-8 -*-

import pymysql
import xlrd

# 開啟資料庫連線(請根據自己的使用者名稱、密碼及資料庫名稱進行修改)
db = pymysql.connect("localhost", "root", "root", "sherry")
# 使用cursor()方法獲取操作遊標
cursor = db.cursor()

# 使用execute方法執行SQL語句
cursor.execute("SELECT VERSION()")

# 建立資料表SQL語句
sql = """CREATE TABLE IF NOT EXISTS TEST (
         id int(11) NOT NULL AUTO_INCREMENT,
         交易訂單號 CHAR(255),
         實收金額  double(20,2),
         商品小計  double(20,2),
         商品編碼  CHAR(255),
         商品名稱  CHAR(255),
         PRIMARY KEY (id)
          )"""

cursor.execute(sql)

xlsxFile = xlrd.open_workbook('./table1.xlsx')
dataRead = xlsxFile.sheet_by_index(0)
rowNum = dataRead.nrows

for i in range(2, rowNum):
    dataLine = dataRead.row_values(i)
    sql = "INSERT INTO TEST(交易訂單號, 實收金額, 商品小計,商品編碼, 商品名稱) \
          VALUES (%s, %s, %s, %s, %s)"
    try:
       # 執行sql語句
       cursor.execute(sql,(dataLine[0],dataLine[1],dataLine[2],dataLine[3],dataLine[4]))
       # 提交到資料庫執行
       db.commit()
    except:
       # Rollback in case there is any error
       print("insert error: ", dataLine)
       db.rollback()

# 執行sql語句
db.close()
  • load data命令

先將xlsx格式的表格另存為txt檔案。在命令列下,

mysql -u root -p

然後:

use database

然後:

load data infile 'E:\\XSH\\MySQL\\FirstMonth.txt'
into table test2
fields terminated by '\t'
lines terminated by '\n'
ignore 1 lines
(交易訂單號,實收金額,商品小計,商品編碼,商品名稱);

這時會出現一些錯誤,如SQL syntax等語法問題。

還有問題1:

ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv

使用命令檢視當前值:

show variables like '%secure%';

這個問題需要在安裝的mysql目錄下找到my.ini檔案,在[mysqld]中加入:

secure-file-priv=''

這個表示任意目下都能匯入檔案到mysql中。也可以自己指定特定的目錄。注意設定完成之後,需要在控制面板->管理工具->服務中找到mysql,重啟mysql服務,在檢視當前值是否修改。不行的話重啟電腦試試。

問題2:

ERROR 1300 (HY000): Invalid utf8 character string: ''

這是txt檔案格式不匹配導致。使用以下命令檢視mysql中變數的格式:

show full columns from testtb;

如果顯示utf-8,則需要將txt用記事本開啟,另存為,選編碼格式為utf-8.

問題3:

ERROR 1261 (01000): Row 228 doesn't contain data for all columns

檢視當前連線的sql_mode:

mysql> show variables like 'sql_mode';

設定 MySQL sql_mode,使其不包含 “strict_trans_tables” mode:

set sql_mode='';

四、三種方式效率比較

  • navicat

大約2小時,電腦很卡,完全不能做其他操作。

  • python指令碼

大約6小時,電腦不太卡,可以進行其他工作,同時報的error也比較多,大約丟失20%的資料。

  • load data

大約10分鐘,不太卡,可以進行其他工作。

五、總結

使用load data方式最為高效,但是這個是需要轉換成txt格式的檔案,還可以試試直接使用xlsx格式匯入。