使用load data方式將xlsx表格百萬行檔案快速匯入mysql中
阿新 • • 發佈:2018-12-24
目錄
-
navicat直接匯入
我是同時使用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格式匯入。