私は、シェルスクリプトではやりづらいと思うものは、pythonで作ることが多い。

今回は、タブ区切りファイルから SQL 文を出力してみた。

今、保守しているシステムでテーブル構造自体をテーブルに定義するものがある。

例えば、

フィールド名 フィールドタイプ 最小値 最大値
名前 全角 1 10

といった類の定義をDBテーブル自体に行うというもの。

追加しかできない上に定義の時は、WEB からいちいち手入力する必要があるし、複数のDBテーブルに設定する必要がある。えらく時間がかかってめんどくさい。

なんだこれ、とブツブツ言いながら、CSV から SQL を生成するスクリプトを作ることにした。DB に接続して直接DBに登録することもできるだろうが、そこまで時間をかけるのも無駄なので、SQL を print するものにとどめた。

詳しい部分は書けないが、次のようなコード。(python3用)

テーブル定義は excel で作られているので、定義部分をコピーしてテキストエディタに貼る。そうすると、タブ区切りになるので、そのファイルを保存して、第3引数で渡す。

import sys
import csv

table_id = int(sys.argv[1])
table_name = sys.argv[2]
table_def = sys.argv[3]

def get_field_type(s):
    if s == '文字(全角・半角)':
        return 0
    elif s == '全角':
        return 1
    elif s == '全角カナ':
        return 2
    elif s == '半角':
        return 3
    else:
        raise Exception

def get_field_length(s):
    if s == '-':
        return "0"
    else:
        return str(int(s))

with open(table_def, newline='', encoding='cp932') as csvfile:
    reader = csv.reader(csvfile, delimiter='\t')
    for row in reader:
        field_id = int(row[0])
        field_name = row[1]
        field_type = get_field_type(row[2])
        sql = """insert into meta_fields (table_id, field_id, field_name, field_type) values({}, {}, '{}', {});"""
        print(sql.format(table_id, field_id, field_name, field_type))
            :
        他にも必要な insert 文を print

設計もこのスクリプトもしょうもないと苦笑してしまう・・・