概要
ある大きなSQLファイルを複数のSQLファイルに分割したいという必要性が生じたので、Pythonプログラムで実装しました。
分割したいSQLファイルがたくさんあるとプログラムで一括処理した方が早いですよね。
前提
前提として、どのSQLファイルもINSERT INTO...
各SQLステートメントから始まるものとします。
また、分割した際のファイル名は01_insert.sql
、02_insert.sql
...といった形で連番のファイル名にして行きます。
サンプルコード
import os
def split_sql_file(file_path):
dir_path = os.path.dirname(file_path)
with open(file_path, 'r') as f:
lines = f.readlines()
insert_file_counter = 1
insert_file = None
for line in lines:
if line.lower().startswith('insert into'):
if insert_file is not None:
insert_file.close()
insert_file = open(os.path.join(dir_path, f'{str(insert_file_counter).zfill(2)}_insert.sql'), 'w')
insert_file_counter += 1
if insert_file is not None:
insert_file.write(line)
if insert_file is not None:
insert_file.close()
split_sql_file('./sample_dir/sample_insert_sql.sql')
split_sql_file('./sample_dir2/sample_insert_sql2.sql')
split_sql_file('./sample_dir3/sample_insert_sql3.sql')
split_sql_file('./sample_dir4/sample_insert_sql4.sql')
サンプルコード解説
-
os.path.dirname(file_path)
: ファイルパスからディレクトリパスを取得 -
open(file_path, 'r')
: 指定されたパスのファイルを読み込みモードで開く -
f.readlines()
: ファイルの全行をリストとして読み込む- 似たメソッドに以下があります
-
read
: ファイルから1行だけ読み込み文字列として返す -
readline
: ファイルを全て読み込み文字列として返す -
readlines
: ファイルから全ての行を読み込み、それぞれの行を要素とするリストを返す
-
- 似たメソッドに以下があります
-
insert_file_counter
: 新しく作成するSQLファイルの名前に使用するカウンター。上述の通り、今回は01...
と採番していくため -
if insert_file is not None:
(1つ目): 既に開いている出力ファイルがある場合、それを閉じるようにします。これはリソースの解放のため -
open(os.path.join(dir_path, f'{str(insert_file_counter).zfill(2)}_insert.sql'), 'w')
: 新しい出力ファイルを作成し、書き込みモードで開く。ここでゼロ埋め処理、ディレクトリ名とファイル名の結合も行う。ファイル名を変えたい場合はここを適宜編集 -
insert_file_counter += 1
で、ファイルカウンターをインクリメント。3つのファイルがあれば03
までですし、15ファイルあれば15
まで採番します -
if insert_file is not None:
(2つ目): 1つ目と同じコードですが、これは一番最後のファイルを閉じるためのもの