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
私が気がついた現状の問題点・注意点は、以下の通りです。
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/
番号単位での管理。
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で設定できたらいいなと。