RoRのMigrationのようなモジュール

Ruby on RailsのMigrationに似たモジュールができたみたいなので、r899で試してみました。

Play! frameworkの1.0.1では「play install migration」ではモジュールをインストールできないので、モジュールのホームページからダウンロードし、フレームワークをインストールしてあるmodulesディレクトリに展開・保存しました。

このモジュールをプロジェクトに追加する為、conf/application.confにmigrationモジュールの設定を追加。DBの設定は、migrationモジュール用に別途、記載する必要があります。また、RoRのmigrationと違い、SQLファイルをDBのコマンドで実行しているので、そのコマンドを指定します。ドキュメントには「db.module.file.format」となっていますが、migrationモジュールのソースを見ると、「migrate.module.file」になっています。

module.migrate=${play.path}/modules/migrate
migrate.module.username=root
migrate.module.password=secret
migrate.module.port=3306
migrate.module.host=localhost
migrate.module.dbs=memo
migrate.module.file.format=mysql -u%(username)s --password=%(password)s -h %(host)s -P%(port)s --skip-column-names %(dbname)s < %(filename)s

私が気がついた現状の問題点・注意点は、以下の通りです。

jpa.ddlはnoneに。

conf/applcation.confで「jpa.ddl=none」と設定し、JPAでスキマーを更新しないようにしないといけません。

initは、conf/application.confの「migrate.module.dbs」の設定を読んでいない。

設定後、「play migrate:init」でアプリケーションルートに「db」というディレクトリが作成されます。この時、create.sql(play migrate:createで実行されるSQLファイル)やdb/migrate配下に作成されるディレクトリはあくまでもサンプルです。つまり、conf/application.confの「migrate.module.dbs」で指定したDB名は使われません。どうやら、${play.path}/modules/migrate/dbをそのままアプリケーションルートにコピーしているだけのようです。したがって、create.sql内のDB名やdb/migrationに作成されるDB名のディレクトリはmigration.module.dbsに設定したものに変更する必要があります。

アプリケーションルートで「play migrate:create」を実行すると、create.sqlに書いてあるSQL文が実行され「patchlevel」というテーブル(RoRでいうschema_info/schema_migrationsテーブルのこと)がDBに作成されます。後は、「play migrate:up」あるいは「play migrate:down」でdb/migration/に保存したSQLファイルが実行されます。

番号単位での管理。

1人で開発している時は問題になりませんが、複数人の場合、同じ番号を使ってしまい...といったことが初期のRoRではあったかと思います。これと同じことが発生すると思います。

upとdownが別々のファイルになっている。

あくまでも、SQLファイルをDBのコマンドにリダイレクトしているだけなので、RoRと違いupとdownは別々。ファイル名は、[version number].[‘up’ or ‘down’].[description].sqlの規則になります。これは、管理しなければならないファイルを増やすことになり、例えば「1.up.create_user.sql」があれば「1.down.remove_user.sql」などがあったりするわけでして。

downは、まだ実装されていない。

downが実装されたら、せめてupとdownでディレクトリをわけてもらえないかな...それか、conf/application.confで設定できたらいいなと。