読者です 読者をやめる 読者になる 読者になる

Database Migration Pluginで任意のSQLを実行する

Database Migration PluginではLiquibaseで使用可能なchangesetのコマンドが、groovyフォーマットのchangesetでも同様に使用可能になっています。

使用可能なコマンドの一覧はLiquibaseのリファレンスを参照してください。

今日はこの中からCustom SQLCustom SQL Fileについて紹介します。

Custom SQL

Custom SQLは任意の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を指定するとコメントが削除され、splitStatementsfalseを指定すると;でステートメントが分割されず、ひとつの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も自動ロールバックには対応していないため、自身でロールバック処理を記述する必要があります。