S2JDBC-Genの紹介 その5 − DDLの生成

S2JDBC-Genの大きな特徴はエンティティクラスからDDLを生成することにあります。これまでの開発ではスキーマを修正してからJavaクラスを変更という流れが一般的だったと思いますが、S2JDBC-Genはエンティティを修正してからその変更をスキーマに適用といった流れの開発を可能にします

DDLの生成

gen-ddlというAntタスクを用意しています。これを実行するとエンティティクラスからスキーマ作成用のDDLスキーマ削除用のDDLの両方を同時に生成します。いまDDLのバージョンが1だとすると、バージョン2用のDDLが0002ディレクトの下に生成されます。
こんな感じです。

gen-ddlをするたびにバージョン番号をあらわすディレクトリが増えていきます。

dbとかmigrateとかのディレクトリの名前づけはRailsを参考にしています。そのほうが何かとわかりやすいと思ったからです(変更もできます)。どんなDDLが出力されるかはファイル名からだいたいわかりますね。たとえば010-create-table.sqlの中身はこうなります。

create table ADDRESS (ID integer generated by default as identity(start with 1), CITY varchar(255), constraint ADDRESS_PK primary key(ID));
create table DEPARTMENT (ID integer generated by default as identity(start with 1), NAME varchar(255), constraint DEPARTMENT_PK primary key(ID));
create table EMPLOYEE (ID integer generated by default as identity(start with 1), FIRST_NAME varchar(255) not null, LAST_NAME varchar(255) not null, DEPARTMENT_ID integer, ADDRESS_ID integer, constraint EMPLOYEE_PK primary key(ID));

create table SCHEMA_INFO (VERSION integer);
insert into SCHEMA_INFO (VERSION) values (2);

最後にSCHEMA_INFOというスキーマのバージョンを管理するテーブルを作成するDDLとバージョン番号を追加するINSERT文があるのがポイントで、このバージョン番号を使ってマイグレーションを制御します。詳しくは次回。


ファイル名は実行時に順番を制御できるように番号を振っています(マイグレーション時に小さい番号のものから実行されます)。管理するのはファイルだけでなくディレクトリも対象です。また、DDLだけでなくCSVも管理対象です。上の画像でいうと040-dumpディレクトリがCSVを管理するディレクトリで、gen-ddlをすると自動でダンプデータをCSV出力するようになっています。ダンプデータはマイグレーション実行時に自動でロードされます。ファイル名の040-dumpの番号は、外部キーを作成するDDLファイルである050-create-foreignkey.sqlより小さいので、外部キー制約を適用する前にデータをロードできるようになっています。

画像からわかるようにS2JDBC-Genが出力するDDLはテーブル、一意キー、シーケンス、外部キーの4つです。これ以外のもの(View、トリガー、ストアドとか)は出力しません(というかエンティティに情報をもっていないのでできません)。
ただし、管理をすることはできます。どいうことかというと、たとえば、060-create-view.sqlといったView用のDDLファイルを生成されたDDLファイルと同じディレクトリに置いておくと、マイグレーションのタスク実行時には050-create-foreignkey.sqlの後で実行され、次回gen-ddlをしたときには次バージョンを表すディレクトリに自動でコピーされていきます。

ddl-info.txtファイルですが、これはDDLのバージョンを管理するファイルです。これについても詳しくは次回。

gen-ddlを実行しても、DDLを生成するだけで生成したDDLをデータベースへは適用はしません。適用するのはマイグレーションのタスクの役目になります。