有時候須要在本地導入一些stage環境的數據到本地mysql,面對1000+的sql文件(包含表結構和數據,放在同一個文件夾下),使用navicat一個一個導入sql文件顯然有點太慢了,因而考慮使用source命令批量來實現。網上看了不少人遇到這個高頻的數據庫sql導入問題,可是沒有特別具體的解決方案,只有個大概的思路,我就拋磚引玉,做爲一個詳細的記錄,渡人渡己。python
先複習一下source的使用方法,首先要用命令行方式鏈接到MySQL數據庫,而後使用下面的命令:mysql
use database_name1
切換到須要被使用的數據庫,而後再使用以下命令:sql
source path/to/file/table_name1.sql
本質上就是要使用這行命令來將sql文件的內容導入database_name1庫裏。使用source對上G大小的sql文件很是高效和絲滑,不會出現圖形化界面導入的時候的卡頓或者崩潰。
可是多個sql文件(好比上千個)那麼就須要source不少次,仍是回到最初的問題,如何能一次性批量source進去呢?shell
這個時候能夠想着建立一個完成批量導入的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實現以下。app
#!/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結果了。
而後調用部分也很簡單,腳本傳入第一個參數就是文件夾的路徑:python2.7
# 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,大功告成!code