分割 SQL 脚本为多个 SQL 文件 Python

一、需求

由于日常分析中,常常会将一些 SQL 脚本写到一个文件中,而其中包括了多个建表语句,他们中部分是并列关系,因此将他们分割为多个文件就有一定的必要性。

包含有以下特性

  • 以英文半角分号 ; 为分割符号,将一个SQL文件分割为多个
  • 只有单独一行的 ; 才会作为分割文件的标识符,因为常常在建表语句前面有删表语句 drop if exist ...;
  • 分割出的文件名必须被指定

二、代码

def split_sql(sql_file, to_dir, file_names):
    """将一个SQL文件分割成几个SQL文件,以单独一行 `;` 作为标识

    Args:
        sql_file (str): 要分割的SQL文件路径
        to_dir (str): 要写入到的文件夹路径
        file_names (列表): 要生成的SQL文件列表
    """
    with open(sql_file, 'r', encoding='utf8') as sf:
        sf_list = sf.read().split('\n;')
        sf_list=[x for x in sf_list if x]
        assert len(sf_list) == len(file_names),'文件、名称数量不相等'
        n_files = len(sf_list)
        for i in range(n_files):
            with open("./"+to_dir+"/"+file_names[i], mode='w', encoding='utf8') as f1:
                f1.write(sf_list[i].strip()+'\n;\n')
                print("完成文件:"+file_names[i])

主要过程就是将文件读取,再利用 \n; 作为分隔符号对文件进行分割,再将这些文件写入到指定文件名的文件中。

三、测试

新建文件: testsql.sql

drop table if exists temp.tablename;
create table temp.tablename STORED AS PARQUET as
file1
;

drop table if exists temp.tablename;
create table temp.tablename STORED AS PARQUET as
file2
;

drop table if exists temp.tablename;
create table temp.tablename STORED AS PARQUET as
file3
;

drop table if exists temp.tablename;
create table temp.tablename STORED AS PARQUET as
file4
;

运行以下脚本进行测试:

if __name__ == '__main__':
    sql_file = './testsql.sql'
    file_names = ['test1.sql', 'test2.sql', 'test3.sql', 'test4.sql']
    to_dir = './dir_sql'
    os.mkdir(to_dir)
    split_sql(sql_file, to_dir,file_names)

函数包含三个参数是:要分割的文件、分割后的文件放到哪个文件夹中(此处是to_dir),和文件名列表。运行后就可以查看到分割后的文件了。

dir_sql/
├── test1.sql
├── test2.sql
├── test3.sql
└── test4.sql
posted @ 2020-10-12 16:55  何大卫  阅读(2449)  评论(0编辑  收藏  举报