分割 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM