2012ǯ12��07��
Java�Υǡ����١����ޥ����졼�����ġ����Flyway�� #JJUG
Java Advent Calendar 2012 7���ܤǤ���
������@megascus����Ρ�Java Bug Database ���Ȥ��Ƥ��ޤ������פǤ�����
���������ҥ����ӥ���Java�Υǡ����١����ޥ����졼�����ġ����Flyway�פ�Ƴ�����Ƥߤ��Ȥ������ʤ��ʤ��������ä��ΤǾҲ𤷤ޤ���
��������
�ޤ����ޥ����졼�������оݤˤʤ�ǡ����١������Ѱդ��ޤ���
���Υ���ȥ꡼�Ǥϡ�MySQL 5.5.28��ȤäƤ��ޤ���
CREATE DATABASE flywayexample DEFAULT CHARACTER SET UTF8;
Flyway��ץ��������Ȥ��Ȥ߹���
�ɥ�����Ȥˤ���Flyway�����Ѥ���ˤϰʲ���3�Ĥμ��ʤ�����褦�Ǥ���
����ϡ�Maven Plugin��Ȥä�������ˡ��Ҳ𤷤ޤ���
Maven��Flyway�����Ѥ���ˤϡ�flyway-maven-plugin��ɬ�פǤ���pom.xml������ϰʲ����̤�Ǥ���
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.ryu22e.flywayexample</groupId>
<artifactId>flywayexample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<description>Example for flyway(http://flywaydb.org/).</description>
<build>
<plugins>
<!-- flyway-maven-plugin������ -->
<plugin>
<groupId>com.googlecode.flyway</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<driver>com.mysql.jdbc.Driver</driver>
<url>jdbc:mysql://localhost:3306</url>
<initialDescription>Base Migration</initialDescription>
<schemas>
<schema>flywayexample</schema>
</schemas>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.googlecode.flyway</groupId>
<artifactId>flyway-core</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>
</dependencies>
</project>
�ǡ����١�������³���뤿��Υ桼����̾���ѥ���ɤ�pom.xml�˽񤤤Ƥ��ޤ���
�񤯤��Ȥ�Ǥ���ΤǤ���������ϡ�$M2_HOME/.m2/settings.xml �˽񤤤��桼����̾���ѥ���ɤ򻲾Ȥ�����ˡ�Ǥ�äƤߤޤ���
$M2_HOME/.m2/settings.xml ������ϰʲ����̤�Ǥ���
<settings xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<servers>
<server>
<id>flyway-db</id>
<username>username</username>
<password>yourpassword</password>
</server>
</servers>
</settings>
�ǥե���ȤǤ�ID��flyway-db�פΥ����С��򻲾Ȥ��ޤ���ID���ѹ�����������pom.xml��
<plugins>
<plugin>
<groupId>com.googlecode.flyway</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<!-- ������ID������� -->
<serverId>example-db</serverId>
</configuration>
</plugin>
</plugins>
�Τ褦�����ꤷ�ޤ���
ư���ǧ
�ޤ��ǽ�ˡ�Flyway��ư���ǧ�򤷤Ƥߤޤ��礦��mvn flyway:info �ǰʲ��Υ�å����������Ϥ����С�Flyway�������ư��Ƥ��ޤ���
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building flywayexample 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- flyway-maven-plugin:2.0.2:info (default-cli) @ flywayexample ---
[INFO] +-------------+------------------------+---------------------+---------+
[INFO] | Version | Description | Installed on | State |
[INFO] +-------------+------------------------+---------------------+---------+
[INFO] | No migrations found |
[INFO] +-------------+------------------------+---------------------+---------+
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.511s
[INFO] Finished at: Sun Dec 02 21:18:09 JST 2012
[INFO] Final Memory: 4M/81M
[INFO] ------------------------------------------------------------------------
Flyway������
����Flyway�ν�������Ԥ��ޤ���mvn flyway:init ��¹Ԥ��ޤ���
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building flywayexample 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- flyway-maven-plugin:2.0.2:init (default-cli) @ flywayexample ---
[INFO] Creating Metadata table: `flywayexample`.`schema_version`
[INFO] Schema initialized with version: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.148s
[INFO] Finished at: Sun Dec 02 21:20:20 JST 2012
[INFO] Final Memory: 4M/81M
[INFO] ------------------------------------------------------------------------
schema_version�Ȥ����ơ��֥뤬�������졢�ǽ�ΥС�������ֹ�ʥǥե���ȤǤ�0�ˤ���Ͽ����ޤ���
�⤦����mvn flyway:info ��¹Ԥ���ȡ����ߤΥС�����󤬳�ǧ�Ǥ��ޤ���
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building flywayexample 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- flyway-maven-plugin:2.0.2:info (default-cli) @ flywayexample ---
[INFO] +-------------+------------------------+---------------------+---------+
[INFO] | Version | Description | Installed on | State |
[INFO] +-------------+------------------------+---------------------+---------+
[INFO] | 0 | Base Migration | 2012-12-02 21:20:20 | Future |
[INFO] +-------------+------------------------+---------------------+---------+
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.625s
[INFO] Finished at: Sun Dec 02 21:23:01 JST 2012
[INFO] Final Memory: 4M/81M
[INFO] ------------------------------------------------------------------------
�ǽ��SQL���������
�Ǥϡ��С������1�Ȥ��ơ��ơ��֥��������Ƥߤޤ��礦��
���饹�ѥ����̤äƤ�����ˡ�db/migration �ե��������������ʲ������Ƥ�V1__Create_book.sql �ե������������ޤ���
CREATE TABLE `book`(
`id` mediumint NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
���������顢mvn compile flyway:migrate ��¹Ԥ��ޤ���
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building flywayexample 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- flyway-maven-plugin:2.0.2:migrate (default-cli) @ flywayexample ---
[INFO] Current schema version: 0
[INFO] Migrating to version 1
[INFO] Successfully applied 1 migration (execution time 00:00.148s).
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.756s
[INFO] Finished at: Sun Dec 02 21:32:29 JST 2012
[INFO] Final Memory: 4M/81M
[INFO] ------------------------------------------------------------------------
����ǡ��������ơ��֥뤬�������줿�Ϥ��Ǥ���mvn flyway:info �dz�ǧ���Ƥߤޤ��礦��
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building flywayexample 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- flyway-maven-plugin:2.0.2:info (default-cli) @ flywayexample ---
[INFO] +-------------+------------------------+---------------------+---------+
[INFO] | Version | Description | Installed on | State |
[INFO] +-------------+------------------------+---------------------+---------+
[INFO] | 0 | Base Migration | 2012-12-02 21:20:20 | Missing |
[INFO] | 1 | Create book | 2012-12-02 21:32:29 | Success |
[INFO] +-------------+------------------------+---------------------+---------+
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.567s
[INFO] Finished at: Sun Dec 02 21:34:35 JST 2012
[INFO] Final Memory: 4M/81M
[INFO] ------------------------------------------------------------------------
�С������1���ѹ�����Ƥ��ޤ���MySQL��ˡ��������ơ��֥�book����������ޤ�����
Flyway�Ǥϡ��ե�����̾��ʲ���̿̾����˽��ä���Τˤ���ȡ��ޥ����졼������оݤ�SQLʸ�Ȥ��Ƽ�ưǧ�����Ƥ���ޤ���

Placefolder
��Placefolder�פ�SQLʸ��ưŪ���ͤ������ळ�Ȥ�Ǥ��ޤ���
pom.xml ��
<plugins>
<!-- flyway-maven-plugin������ -->
<plugin>
<groupId>com.googlecode.flyway</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<placeholders>
<tableName>magazine</tableName>
</placeholders>
</configuration>
</plugin>
</plugins>
�Ƚ񤤤ơ�SQL��
CREATE TABLE `magazine`(
`id` mediumint NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
INSERT INTO `${tableName}` (`title`) VALUES ('test1');
�Ƚ񤯤ȡ�mvn compile flyway:migrate �¹Ի���${tableName}��magazine���Ѵ����Ƥ���ޤ���
�ޤ����ʲ��Τ褦�˥��ޥ�ɤΰ����Ȥ���Placefolder����ꤹ�뤳�Ȥ�Ǥ��ޤ���
mvn compile flyway:migrate -Dflyway.placeholders.Placefolder��̾��=��������
��ö���Ƥ������DROP����������
mvn flyway:clean �����Ƥ������DROP����ޤ���
�¹Ԥ���ȡ�����̵�Ѥ�DROP���ޤ���
�¹Ԥ��뤫�ɤ�����ǧ���륪�ץ����Ǥ�ʤ��Τ���Ĵ�٤Ƥߤ��ΤǤ�������������ޤ���Ǥ�����
���ִĶ��Ǥ����¹Ԥ��������Τǡ����Ф˻Ȥ�ʤ��Ǥ���������
�ʤޤ���SSH��ľ�ܥޥ����졼������¹Ԥ���褦�ʱ��Ѥˤ��ʤ���CI���Ȥ߹���Τ����ۤʤΤǤ��礦���ġ�
Java���饹�ǥޥ����졼�����
SQL�ե���������Ǥʤ���Java���饹�ǥޥ����졼����󤹤뤳�Ȥ�Ǥ��ޤ���
�ѥå�����db.migration�β���SQL�ե������Ʊ��̿̾����ǡ�com.googlecode.flyway.core.api.migration.jdbc.JdbcMigration��implement������Java���饹����ȡ��ޥ����졼������оݤȤ���ǧ�����Ƥ���ޤ���
package db.migration;
import java.sql.Connection;
import java.sql.PreparedStatement;
import com.googlecode.flyway.core.api.migration.jdbc.JdbcMigration;
public class V2__Insert_into_magazine implements JdbcMigration {
public void migrate(Connection connection) throws Exception {
PreparedStatement statement =
connection
.prepareStatement("INSERT INTO `magazine` (`title`) VALUES ('sample')");
try {
statement.execute();
} finally {
statement.close();
}
}
}
Java�ϥҥ��ɥ�����Ȥ��ʤ��Τǡ�����ä�ʣ����SQLʸ�ˤʤ�����˸��񤯤ơ��Ŀ�Ū�ˤϤ��ޤ�Ȥ������Ȥϻפ�ʤ��ΤǤ�����forʸ�����̤˥ǡ���������������ʤɤ��������⤷��ޤ���
�Ǹ��
��Ƭ�Ǥ⿨�줿�褦�ˡ�Flyway�����ҥ����ӥ��˺Ƕ�Ƴ�������ΤǤ���������Υե졼������O/R�ޥåѡ��˰�¸������ΤǤϤʤ��Τǡ��ä��ç¤ï¿½ï¿½ï¿½È¤ï¿½É¤ï¿½ï¿½ï¿½ï¿½â¤¢ï¿½ï¿½Þ¤ï¿½ï¿½ï¿½Ç¤ï¿½ï¿½ï¿½ï¿½ï¿½
����Ҳ𤷤��ΤϤۤ�ο���ǡ���äȹⵡǽ�ʥġ���ʤΤǤ���������äȻ�˿��äƤߤ����٤ʤ��ñ������Ǥ���ġ���Ǥ����ǡ����١����ޥ����졼�����ġ����Ƴ����Ƥ����Ƥ������ϻ�ƤߤƤϤ������Ǥ��礦����
�����ϡ�@empressia����Ǥ���