Apache Maven で SQL を実行する (SQL Maven Plugin)

投稿者 : OSCA

[PR] "出川哲朗の充電させてもらえませんか?"で登場したロケ地を紹介するファンサイト「あの場所へ行こう!」はこちら。

 Apache Maven から SQL が実行できたらと思う場合があります。 例えば Maven でユニットテストを実行する前にデータベースの初期化処理として SQL を実行したい場合などです。そのような場合に SQL Maven Plugin というプラグインがとても便利です。本稿では SQL Maven Plugin について解説します。

概要

 SQL Maven Plugin は、Apache Maven から SQL を実行するためのプラグインです。SQL Maven Plugin が提供するゴールを実行すれば SQL の実行だけをすることもできますし、上記のように「テストを実行する前に SQL を実行する」などのように特定の実行フェーズと絡めて SQL を実行することもできます。

 SQL Maven Plugin では、プラグインの設定として pom.xml の中に記述した SQL 文を実行することもできますし、ファイルに保存した SQL 文を実行することもできます。

SQL Maven Plugin が提供するゴール

 SQL Maven Plugin が提供するゴールは、sql:execute だけです。

ゴール 説明
sql:execute SQL文を実行します。

SQLを実行する簡単な例

 それでは SQL を実行する簡単な例を示してみたいと思います。ここでは user と admin というテーブルの全レコードを削除する SQL を実行する例を示します。pom.xml には次のように記述します。

<project>
  ...
  <build>
    ...
    <plugins>
      ...
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>sql-maven-plugin</artifactId>
        <version>1.5</version>
        <dependencies>
          <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version<5.1.36</version>
          </dependency>
        </dependencies>
        <configuration>
          <driver>com.mysql.jdbc.Driver</driver>
          <url>jdbc:mysql://localhost:3306/hoge</url>
          <username>hoge</username>
          <password>moge</password>
          <sqlCommand>
            DELETE FROM user;
            DELETE FROM admin;
          </sqlCommand>
        </configuration>
      </plugin>
    </plugins>
  </build>

 まずは <plugins> に SQL Maven Plugin (sql-maven-plugin) を利用することを宣言します。 2016年01月現在、バージョン 1.5 が最新だったので 1.5 を指定しています。

 次に <dependency> タグで、接続するデータベースの JDBC ドライバを指定します。 ここでは MySQL データベースに接続することを想定し、 mysql-connector-java を指定しています。 もちろん PostgreSQL でも H2 でも、他のデータベースのドライバを指定すればそれぞれのデータベースに接続することができます。

 そして一番重要なのが <configuration> タグです。 まずは driver, url, username, password などに接続先となるデータベースの情報を設定します。 ここではローカルにインストールした MySQL の hoge データベースに接続しています。 接続先情報を書いたら、<sqlCommand> タグに実行する SQL 文を記述します。 複数の SQL 文を実行する場合は、上記のように改行して複数記述します。

 これで pom.xml の編集を完了です。 さっそく mvn コマンドで SQL を実行してみましょう。 次のように sql:execute ゴールを実行します。

$ mvn sql:execute

 これで SQL の実行ができたはずです。

別ファイルに記述したSQLを実行する

 前節では pom.xml に SQL 文を直接記述しましたが、別ファイルに記述した SQL を実行することもできます。 pom.xml に SQL 文を記述する際には <sqlCommand> タグで指定しましたが、SQL が保存された外部ファイルを指定する場合は次のように <srcFiles> で指定します。

  ...
  <configuration>
    <driver>com.mysql.jdbc.Driver</driver>
    <url>jdbc:mysql://localhost:3306/hoge</url>
    <username>hoge</username>
    <password>moge</password>
    <srcFiles>
      <srcFile>${basedir}/delete.sql</srcFile>
    </srcFiles>
  </configuration>
  ...

 ここではプロジェクト直下にある delete.sql を実行するように指定しました。 delete.sql には単純に DELETE 文が記述されているだけです。 このように pom.xml を編集して実行してみてください。 DELETE 文が実行されるはずです。

別の実行フェーズと共に SQL を実行する

 ここまでは mvn sql:execute でゴールを指定して SQL を実行してきましたが、別の実行フェーズと共に SQL を実行させることもできます。 実際の運用上、そのようなケースの方が多いのではないでしょうか。

まずは pom.xml の記述例を示します。

<project>
  ...
  <build>
    ...
    <plugins>
      ...
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>sql-maven-plugin</artifactId>
        <version>1.5</version>
        <dependencies>
          <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.36</version>
          </dependency>
        </dependencies>
        <configuration>
          <driver>com.mysql.jdbc.Driver</driver>
          <url>jdbc:mysql://localhost:3306/hoge</url>
          <username>hoge</username>
          <password>moge</password>
        </configuration>
        <executions>
          <execution>
            <phase>test-compile</phase>
            <goals>
              <goal>execute</goal>
            </goals>
            <configuration>
              <sqlCommand>DELETE FROM user;</sqlCommand>
            </configuration>
          </execution>
          ...
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

 先ほどの例との大きな違いは pom.xml に <executions> タグが追加された点です。ここでは <execution> タグの <phase> で、テスト実行前のコンパイルフェーズで SQL を実行するように指定しています。テストを実行する前にテーブルを初期化しているイメージです。

 また <executions> タグ内の <execution> タグは複数記述することができます。もうひとつ <execution> タグを追加して、テスト終了時にも SQL 文を実行するようなこともできます。

 前節同様ですが、<sqlCommand> タグだけではなく <srcFiles> で SQL が記述された外部ファイルを指定することも可能です。

考察

 ここまで Apache Maven から SQL 文を実行する方法について解説しましたが、考慮すべきは「Apache Maven で実行すべき SQL は何か?」という視点だと思います。 ここまでのサンプルで示した通り、pom.xml に対して SQL 文の実行方法を1つ指定します。 「この場合はAのSQLを、この場合はBのSQLを」というような条件を指定して SQL を実行するようなことは難しいでしょう。 あくまでもビルドの一貫として決まった SQL 文を実行するために利用するものだと認識しておいた方が良いでしょう。 複雑な条件で SQL を実行したい場合は Java のプログラムなどを書いて処理した方が良いでしょう。

おわりに

 本稿では Apache Maven から SQL を実行できるようにする SQL Maven Plugin について解説しました。 Maven でのテストやビルドの際に SQL を実行するのにとても便利ですので、覚えておいて損はないでしょう。

Apache Maven の目次へ戻る

Apache Mavenのトップへ戻る

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。 個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca