• 分割 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('
    ;')
            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()+'
    ;
    ')
                    print("完成文件:"+file_names[i])
    

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

    三、测试

    新建文件: 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
    
  • 相关阅读:
    IP地址和进制转换
    Cisco交换机常见配置
    macOS上的autoreconf错误导致无法安装问题
    LG P5147 随机数生成器
    LG P1879 [USACO06NOV]Corn Fields G
    LG P5017 [NOIP2018]摆渡车
    mysql触发器trigger详解
    MybatisPuls中QueryWrapper的select、update的用法
    @Transactional各属性详解
    Linux如何查看进程、杀死进程、启动进程等常用命令(包括常用的命令,如查看文件,修改文件读写权限、寻找文件等)
  • 原文地址:https://www.cnblogs.com/heenhui2016/p/13803765.html
Copyright © 2020-2023  润新知