程式設計方式實現MySQL批量匯入sql檔案

freephp發表於2020-12-26

有時候需要在本地匯入一些stage環境的資料到本地mysql,面對1000+的sql檔案(包含表結構和資料,放在同一個資料夾下),使用navicat一個一個匯入sql檔案顯然有點太慢了,於是考慮使用source命令批量來實現。網上看了很多人遇到這個高頻的資料庫sql匯入問題,但是沒有特別具體的解決方案,只有個大概的思路,我就拋磚引玉,作為一個詳細的記錄,渡人渡己。

先複習一下source的使用方法,首先要用命令列方式連線到MySQL資料庫,然後使用下面的命令:

use database_name1

切換到需要被使用的資料庫,然後再使用如下命令:

source path/to/file/table_name1.sql

本質上就是要使用這行命令來將sql檔案的內容匯入database_name1庫裡。使用source對上G大小的sql檔案非常高效和絲滑,不會出現圖形化介面匯入的時候的卡頓或者崩潰。
但是多個sql檔案(比如上千個)那麼就需要source很多次,還是回到最初的問題,如何能一次性批量source進去呢?

這個時候可以想著建立一個完成批量匯入的sql檔案,假設命名為batch.sql,裡面的內容大概如下:

source /path/to/file/table_name1.sql
source /path/to/file/table_name2.sql
source /path/to/file/table_name3.sql
...
省略900多行
source /path/to/file/table_name1000.sql

人工的去編寫這個batch檔案顯然費力,但是我們現在目標明確了,就是要想辦法實現生成這樣的batch.sql檔案。
可以考慮使用指令碼程式來實現,把這個問題轉換成一個簡單的指令碼任務:
對指定路徑的資料夾下所有檔名進行收集,並且是每個檔案的全路徑+檔名寫入一個新的sql檔案裡面。當然別忘了每行開頭要新增一個source命令,一個檔案單獨一行。
用Python實現最簡單,os.walk可以用於遍歷資料夾下的資料夾和檔案,get_source_batch_file.py實現如下。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import sys
import os
'''
To get all the full path of files under a given path, not to search for sub folder's files.
'''
def get_current_dir_filename_with_full_path(path: str) -> list:
    filename_list = []
    for i,j,filename in os.walk(path):
        for item in filename:
            filename_list.append(path + item)
        return filename_list

這裡只處理當前目錄下的檔案,不會收集子目錄下的檔案,所以最外層的迴圈第一次完成後就return結果了。
然後呼叫部分也很簡單,指令碼傳入第一個引數就是資料夾的路徑:

# usage
# the second params from terminater is the folder path.
try:
    mypath = sys.argv[1]
except IndexError:
    mypath = '/Users/tony/pythonwork/test/leetCode/testsqlFiles/'

if mypath[len(mypath) - 1] != '/':
    mypath += '/'
filename_list = get_current_dir_filename_with_full_path(mypath)

for filename in filename_list:
    print("source " + filename)

可以看出接收引數也做了入參的路徑補全的處理,同樣也可以不傳引數,預設值就是我們需要處理的資料夾的全路徑,之所以接收入參是為了日後使用更加靈活。

最後在終端使用命令如下:

python3.7 get_source_batch_file /Users/tony/pythonwork/test/leetCode > ./batch.sql

執行完成後在當前目錄下就會生成需要的batch.sql。注意,我這裡是使用的python3.7命令,這是因為我本機MacOS系統自帶了一個python2.7,所以我單獨安裝了一個python3.7,由於get_source_batch_file.py用了python3特有的type hint寫法,所以必須使用3.x的python命令才能正常執行。
所以方法總比困難多,沒有現成的工具,我們自己寫一個就OK了。
最後source /path/to/batch.sql,大功告成!

相關文章