Database Migration Pluginでcontextを使用する
LiquibaseではchangeSetにcontext
属性が設定できます。このcontext
属性を使用することで、実行時に適用するchangeSetの範囲を指定できます。
databaseChangeLog = { changeSet(author: "yamkazu", id: "default-ctx") { ... } changeSet(author: "yamkazu", id: "prod-ctx", context: "prod") { ... } changeSet(author: "yamkazu", id: "test-ctx", context: "test") { ... } }
実行時にcontext
を指定するには--contexts
オプションを使用します。
grails> dbm-update --contexts="test"
いくつかの特徴的なルールがあるので以下にまとめます。
- 複数指定する場合はカンマで区切る
- changeSetで
context
が無指定の場合は常に実行される --contexts
を指定しないとすべてのコンテキストが対象になる
後ろ2つが若干わかりにくいですが、--contexts
の指定と実行されるid
は以下のようになります。
- dbm-update -
default-ctx
、test-ctx
、test-ctx
のchangeSetを実行 - dbm-update --contexts="test" -
default-ctx
、test-ctx
のchangeSetを実行 - dbm-update --contexts="test,prod" -
default-ctx
、test-ctx
、test-ctx
のchangeSetを実行
特に指定しないとすべてのコンテキスト実行される点は注意が必要です。例えばtest
のようなコンテキストを作成した時点で、本番環境に適用する際には明示的に何かのコンテキストを指定しないと、test
を含む全てのchangeSetが適用されるといった動作をします。この場合は実際にそのコンテキストが存在するかは別として、明示的に何らかの適当なコンテキストを指定しておく必要があります。
updateOnStart
でアプリケーション起動時に連動させるにはConfig.groovyでgrails.plugin.databasemigration.updateOnStartContext
を指定してください。
grails.plugin.databasemigration.updateOnStartContext="prod"