はじめに
JavaのDBマイグレーションとして有名なFlywayなのですが、触ったことなかった為正月休みを利用して導入してみました。
動作するまでに3時間と見積もっていましたが、実際は15分ぐらいで終わりました。
ひとまずのやりたいこと洗い出し
- 自作アプリへのFlyway導入(Gradle使用)
- Flywayを利用した初心者DBマイグレーション
- まとめ(Qiita記事作成)
Flyway導入
SpringBoot + Gradleで動作しているWebApplicationへ導入してみる。
導入までに必要な手順は以下のみ、、、簡単!
- build.gradleに必要事項を記入する
- CretateTable文以下のSQLファイルを配置する。
- Springbootを起動(IntelliJ IDEAから起動)
build.gradleに必要事項を記入する。
ext {
// Flyway
flywayVersion = "4.1.2" // 2017,0315最新
}
dependencies {
// Flyway
compile ("org.flywaydb:flyway-core:$flywayVersion")
}
plugins {
id "org.flywaydb.flyway" version "4.1.2" // 2017,0315最新
}
flyway {
user = '' // DBのユーザー名
url = ''// DBのURL
}
SQLファイルの配置
次にCretateTable文等のSQLファイルを以下に配備
・src/main/resources/db/migration/
配備するファイルのファイル名には命名規則があります。
また、CreateDatabase等は書けない模様
- そもそもDatabaseURLにDatabaseまで指定していたらそりゃできない
CREATE TABLE IF NOT EXISTS ANSWER_INFO_TBL (
NO BIGINT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
TYPE TINYINT(1) NOT NULL,
ANSWERKEY VARCHAR(81) UNIQUE NOT NULL,
KEYHASH VARCHAR(64) UNIQUE NOT NULL ,
CREATE_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=INNODB DEFAULT CHARSET=UTF8;
CREATE TABLE IF NOT EXISTS SCORE_INFO_TBL (
NO BIGINT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT,
SCORE MEDIUMINT(7) UNSIGNED DEFAULT 0 NOT NULL,
NAME VARCHAR(64) DEFAULT '' NOT NULL,
MEMO VARCHAR(64) DEFAULT '' NOT NULL,
UPDATE_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (NO)
REFERENCES ANSWER_INFO_TBL(NO)
ON DELETE CASCADE
) ENGINE=INNODB DEFAULT CHARSET=UTF8;
ALTER TABLE ANSWER_INFO_TBL ADD INDEX INDEX_ANSWERKEY(ANSWERKEY ASC);
ALTER TABLE ANSWER_INFO_TBL ADD INDEX INDEX_KEYHASH(KEYHASH ASC);
Springbootを起動
IntelliJ IDEAからアプリを立ち上げる際に、自動でDBマイグレーションが行われる。
- 起動する前に既存のテーブルを__Drop__しないと動作したかよくわかりませんので、動作前に__Drop__しておく。
Flywayを使ってなんとなく便利化する。
アプリを作っている最中ゴミデータを作成してしまったり、DBをリセットしたくなったりします。
ただし、綺麗なデータは残しておきたい、、、
→問題ない既存レコードを抽出して、DBリセット後自動でインサートさせる
→→Flywayにやらせる!
- 既存レコードはMysqlWorkbenchにて取得(Export Resultsにてinsert文の形式でsqlファイルとして取得できる)
- src/main/resources/db/migration/配下にインサート文のsqlファイルを配備
テーブルdrop後に上記条件でSpringbootを起動すると、テーブル作成とレコード作成を自動化してくれる。
sqlファイルもバージョン管理をしっかりしていれば環境構築のハードルが下がりそう!
まとめ
すんなりと導入できてしまったので、今まで導入を躊躇していた自分の背中を押してあげたい気分です。
DBのリセットはしょっちゅうしていますので、sqlファイルの管理も怠らないように心がけます。
また、導入のみで未だ見ぬ便利機能が存在するかと思いますので機能発見次第追記していこうと思います。
また、__Flyway__の記事タグがあるみたいなのでフォローして見てもいいかと思います。
おまけ
JPAのEntityにて、Date型からLocalDate型に変更した際、
以下のようなテクニックを使用しないといけないようです
@SpringBootApplication
@Import(Domain.class)
@EntityScan(basePackageClasses = {WebApp.class, Jsr310JpaConverters.class})
@EnableScheduling
public class WebApp extends SpringBootServletInitializer {
public static void main(String[] args) {
new SpringApplicationBuilder(WebApp.class)
.profiles("dev")
.run(args);
}
}
ミソなのは__Jsr310JpaConverters.class__をEntityScanの対象としていることです。