有时候须要在本地导入一些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