CSV(TSV)からSQLを作る
2018/08/25 - moriya - ~2 Minutes
私は、シェルスクリプトではやりづらいと思うものは、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
設計もこのスクリプトもしょうもないと苦笑してしまう・・・