1. 程式人生 > >程式設計方式實現MySQL批量匯入sql檔案

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

有時候需要在本地匯入一些stage環境的資料到本地mysql,面對1000+的sql檔案(包含表結構和資料,放在同一個資料夾下),使用navicat一個一個匯入sql檔案顯然有點太慢了,於是考慮使用source命令批量來實現。網上看了很多人遇到這個高頻的資料庫sql匯入問題,但是沒有特別具體的解決方案,只有個大概的思路,我就拋磚引玉,作為一個詳細的記錄,渡人渡己。 先複習一下source的使用方法,首先要用命令列方式連線到MySQL資料庫,然後使用下面的命令: ```shell use database_name1 ``` 切換到需要被使用的資料庫,然後再使用如下命令: ``` source path/to/file/table_name1.sql ``` 本質上就是要使用這行命令來將sql檔案的內容匯入database_name1庫裡。使用source對上G大小的sql檔案非常高效和絲滑,不會出現圖形化介面匯入的時候的卡頓或者崩潰。 但是多個sql檔案(比如上千個)那麼就需要source很多次,還是回到最初的問題,如何能一次性批量source進去呢? 這個時候可以想著建立一個完成批量匯入的sql檔案,假設命名為batch.sql,裡面的內容大概如下: ```shell 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實現如下。 ```python #!/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結果了。 然後呼叫部分也很簡單,指令碼傳入第一個引數就是資料夾的路徑: ```python # 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,大