多数のSQLファイルからよく使うテーブル名を調べるサンプル
bonlifeです。10月になって、新入社員が来たり、他部署から来た人がいるので、うちの部署でよく使うOracleのテーブルだけでも簡単に説明することになりました。で、過去自分が書いたSQL(SELECTばっかり)を調査して、よく使うテーブルを調べてみることに。そんな時はもちろんPython。
スクリプトは殴り書きなので、SELECTにしか対応してなかったり、テーブル名で使える文字を必要以上に厳しくチェックしてたり、フォルダ名やファイル名を固定値で埋め込んでいたりしますが、気にしない方向で。(optparse使う自分用雛形を用意しておいて、修正するようにした方が良い気がしてきました…。)
- tablename_count.py
# -*- coding: cp932 -*- import re import os table_count_dict = dict() def prettify_tablename(s): tablename = s.strip().split()[0].upper() if re.match(r'^[0-9A-Z$_."]+$',tablename): if '.' in tablename: return tablename.split('.')[1].strip('"') else: return tablename.strip('"') def divide_tablename(s): return [prettify_tablename(x) for x in s.split(',')] def count_tablename(f): content = open(f).read() p = re.finditer(r'from\s(?P<tables>.*?)(\swhere|;|[(])', content, (re.IGNORECASE|re.MULTILINE|re.DOTALL)) if p: for i in p: tables = divide_tablename(i.group('tables')) for i in tables: table_count_dict[i] = table_count_dict.get(i,0) + 1 for root, dirs, files in os.walk(r'C:\test\sql'): for i in files: count_tablename(os.path.join(root,i)) table_count_list = zip(table_count_dict.keys(),table_count_dict.values()) outfile = open('result.txt','w') for i in sorted(table_count_list,cmp=lambda x,y: cmp(x[1],y[1]),reverse=True): outfile.write("%s\t%s\n" % (i[0], i[1]))
あのあたりでSQLファイルばっかりを集めたフォルダを指定してあげてから、このスクリプトを実行すると、上手くいけば以下のような内容の result.txt が出力されます。
TABLE_D 92 TABLE_A 52 TABLE_C 29 TABLE_B 23
でっていう。
実際には、SQLファイルばっかり集めたフォルダがなかったので、メモを集めたフォルダで実行しました。そしたら、Pythonの from で始めるimport文が引っかかったりして、もう大変!日ごろからのファイル整理が大切ですね…orz