標準の初期化
application.properties に初期化SQLを実行する設定を記述することにより、クラスパス直下のSQLファイルが存在すれば読み込んで実行される。
▼ application.properties
# ALWAYS : アプリ起動時に毎回実行
# EMBEDDED : 埋込DB(H2 Database)の時のみ実行
# NEVER : 実行しない
spring.datasource.initialization-mode=always
alwaysを設定すると、毎回、SQLが実行される設定しているので、2回目以降の実行でエラーとならないSQLの工夫が必要。
▼ SQLファイル一覧
クラスパスの通っているディレクトリ : src/main/resources/
schema-(platform).sql
schema.sql
data-(platform).sql
data.sql
ex) src/main/resources/*.sql
▼ 工夫したSQL(PostgreSQL)
-- 存在しない場合のみテーブルを定義
CREATE TABLE IF NOT EXISTS batch.hoge (
id bigserial NOT NULL,
name character varying(100),
PRIMARY KEY(id),
UNIQUE(name)
);
-- nameの一意制約発生を避けるため、ON CONFLICTを使用
INSERT INTO batch.hoge (name) VALUES ('taro')
ON CONFLICT ON CONSTRAINT hoge_name_key
DO NOTHING;
INSERT INTO batch.hoge (name) VALUES ('jiro')
ON CONFLICT ON CONSTRAINT hoge_name_key
DO NOTHING;
INSERT INTO batch.hoge (name) VALUES ('saburo')
ON CONFLICT ON CONSTRAINT hoge_name_key
DO NOTHING;
INSERT INTO batch.hoge (name) VALUES ('shiro')
ON CONFLICT ON CONSTRAINT hoge_name_key
DO NOTHING;
DBマイグレーションによる初期化
標準の初期化では、2度目から「spring.datasource.initialization-mode=never」にするか、SQLに手間をかけなければなりません。
flywayなどを使えば、実行済みのSQLファイルは1度しか実行されないので楽になるはず。
▼ pomx.xml
<dependencies>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
</dependencies>
▼ SQL実行ファイル例
src/main/resources/db/migration/V0.0.1_schema.sql
src/main/resources/db/migration/V0.0.2_data.sql