33
32

More than 5 years have passed since last update.

SpringBootのDB初期化方法

Posted at

標準の初期化

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

References

33
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
32