Database Migration Pluginで任意のSQLを実行する
Database Migration PluginではLiquibaseで使用可能なchangesetのコマンドが、groovyフォーマットのchangesetでも同様に使用可能になっています。
使用可能なコマンドの一覧はLiquibaseのリファレンスを参照してください。
今日はこの中からCustom SQLとCustom SQL Fileについて紹介します。
Custom SQL
changeSet(author: "yamkazu (generated)", id: "create-person") { sql("CREATE TABLE person ( id int8 primary key, name varchar(255) )") sql(""" |INSERT INTO person ( id, name ) VALUES ( 1, 'tanaka' ); |INSERT INTO person ( id, name ) VALUES ( 2, 'sato' ); """.stripMargin()) sql([stripComments: true, splitStatements: false], """ |INSERT INTO person ( id, name ) VALUES ( 3, 'suzuki' ); -- insert suzuki |INSERT INTO person ( id, name ) VALUES ( 4, 'yamamoto' ); -- insert yamamoto """.stripMargin()) rollback { sql("DELETE FROM person") dropTable(tableName: "person") } }
例を見ればだいたい使い方が想像できると思います。
一番シンプルな使い方はsql("...")
形式で実行したいSQLを指定するだけです。
属性を付与しつつ内容を記述する場合はsql([stripComments: true, splitStatements: false],"…")
のように第1引数にmapで属性を指定し、第2引数にクエリーの文字列を指定します。いくつか属性がありますがstripComments
属性にtrue
を指定するとコメントが削除され、splitStatements
にfalse
を指定すると;
でステートメントが分割されず、ひとつの1つのステートメントとして実行されます。
sql
コマンドを使用する際の注意点ですが、自動ロールバックに対応していないということです。createTable
といったコマンドではデフォルトでそれに対するロールバックが定義されていますが、sql
ではそれがないため明示的にrollback
コマンドを使用して、このchangeSetをロールバックする処理を記述する必要があります。
roolback
は直接SQLを記述したりchangeSetで使用可能なコマンドが使用できます。詳細はリファレンスを参照してください。
Custom SQL File
Custom SQL Fileは任意のSQLファイルを実行できます。
changeSet(author: "yamkazu (generated)", id: "create-person") { sqlFile(path: "create-person.sql") sqlFile(path: "sql/person-data-1.sql") sqlFile(path: "/sql/person-data-2.sql", stripComments: true, splitStatements: false) rollback { dropTable(tableName: "person") } }
path
にファイルを指定することで使用できます。ファイルはクラスパスから読みだされchangelog.groovyを起点としてた相対パス、または絶対パスが使用できます。
Custom SQLと同様にCustom SQL Fileも自動ロールバックには対応していないため、自身でロールバック処理を記述する必要があります。