« プロジェクト管理ソフトウエア | トップページ | 「隣同士なのになぜ話さないのか」 »

2006年9月 4日 (月)

Rakeを使ってSQL-DDLファイルを作る

Rake(Ruby Make) は、make、antに代表される、「ビルド・ツール」の一つです。「タスク(task)」と、タスク間の依存関係を定義すると、その依存関係に従って、タスクを実行してくれます。もちろん、makeにあるような、「ソース」ファイル、「ターゲット」ファイルのタイムスタンプを比較して、ターゲットがソースより古ければタスクを実行、ということもできます。

Rakeを特徴づけているのは、これが、Rubyの「ライブラリ」-より正確には「言語内DSL」 -となっている点です。この特徴により、Rubyを使用してタスクをプログラミングすることができます。

私は、テーブル仕様書-データーベース・テーブルのレイアウトを書いたドキュメント-から、DDL文(CREATE TABLE文)が入っているファイルを自動生成する、といった仕事に、このソフトウエアを使用しています。これがどんな感じなのか、以下で記述したいと思います。

--

1) テーブル仕様書(Excel)をテキストファイルにする

テーブル仕様書は、Excelワークシートとして作成しています。1シート1テーブルで記述しています。1つのワークシートを、1つのテキストファイルにします。テキストファイルの名前は、テーブル名にして、中身は、ワークシートをそのままコピーしてます(タブ区切りのテキストになりますよね)。一応、この作業を自動化するマクロを書いてます。

2) 上記テキストファイルからDDL文を生成するRubyプログラムを作成する

上記のテキストファイル-定義ファイルと呼んでます-から、DDL文を生成する、Rubyプログラムを作成しています。これは、以下のような感じです。

 

# sqlgen.rb:
# テーブルDDL文の生成。
def generateTableDDL(src_file, target_file,
  schema = '', data_ts = '', index_ts = data_ts,
  pkey_extract = /^#{schema}_/)
  
  ddl = TableDDL.new(
    File.basename(src_file, '.def'),
    schema, pkey_extract)
  
  # DDLオブジェクトを構築。
  ddl.load_from_file(src_file)
  
  # DDL文をファイルに書き出す。
  ddl.generate_sql(target_file, data_ts, index_ts)
end

3) 「DDL文生成タスク」を定義する

定義ファイルから、DDL文ファイルを生成するタスクを定義します。これは、以下のような感じです。

 

# sqlgen-task.rb:
# テーブルスクリプト生成タスクの作成。
def make_sqlgen_table_task(src_dir, dst_dir,
  task_symbol,
  schema = '', data_ts = '', index_ts = data_ts,
  pkey_extract = /^#{schema}_/)
  
  Dir.glob(File.join(src_dir, '*.def')) do |file|
    target = File.join(dst_dir, 
      File.basename(file, '.def') + '.sql')
    file target => [file] do |t|
      generateTableDDL file, target, schema,
        data_ts, index_ts, pkey_extract
    end
    task task_symbol => target
  end
end

ディレクトリ"src_dir"にある定義ファイル"*.def"全てについて、対応するDDL文ファイルをディレクトリ"dst_dir"に作成するタスクです。

4) Rakefileを作成する

"Rakefile"は、Rakeがデフォルトで使用する、タスク定義ファイルです。つまり、Rakefileのあるディレクトリで、

>rake

とコマンドを打つと、このファイルにある「デフォルト・タスク」
(":default")が実行されます。

Rakefileは、以下のような感じです。

 

# Rakefile:
# テーブル作成スクリプト生成タスク。
# tabledef->createtable.sql
make_sqlgen_table_task(
  File.join(SCHEMA_DIR, TABLE_DEF_DIR),
  File.join(SCHEMA_DIR, CREATE_TABLE_DIR),
  :generate_create_table,
  SCHEMA_NAME,
  DATA_TABLESPACE,
  INDEX_TABLESPACE)
# タスク指定なしのrakeコマンドで実行するタスク。
task :default => [:generate_create_table]

--

RDBMSはOracleを使用しています。インデックス、権限付与、シノニムなどのDDL生成も、これで行なっています。こうした、「共通」の部分に加え、さらに、案件特有のものも追加したりしてまして、例えば、テーブルの「管理項目」を入力するトリガーとか、削除データを別テーブルに保存するトリガーなども、生成したりしています。

--

Using the Rake Build Language

Martin Fowler氏による、Rakeの解説です。これだけ詳しい解説があれば、十分だと思います。

|

« プロジェクト管理ソフトウエア | トップページ | 「隣同士なのになぜ話さないのか」 »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



« プロジェクト管理ソフトウエア | トップページ | 「隣同士なのになぜ話さないのか」 »