zoukankan      html  css  js  c++  java
  • 分割 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
    
  • 相关阅读:
    自增长主键Id的另类设计
    Android 混淆那些事儿
    H5 和移动端 WebView 缓存机制解析与实战
    快速上手 Kotlin 的 11 招
    教你 Debug 的正确姿势——记一次 CoreMotion 的 Crash
    小程序组件化框架 WePY 在性能调优上做出的探究
    基于 TensorFlow 在手机端实现文档检测
    HTTPS 原理浅析及其在 Android 中的使用
    Bugly 多渠道热更新解决方案
    Swift 对象内存模型探究(一)
  • 原文地址:https://www.cnblogs.com/heenhui2016/p/13803765.html
Copyright © 2011-2022 走看看