0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめてのアドベントカレンダーAdvent Calendar 2024

Day 16

SpringBootでDBのマイグレーションを管理する(MySQL)

Last updated at Posted at 2024-12-15

前回のつづき
前回はDockerを使用してMySQLコンテナ起動を行った。

SpringBoot 向けのMySQLセットアップ覚え書き

目的

SpringBootアプリケーションとMySQLの接続設定をする。
migrationファイルを作成してDBの変更管理を可能にする。

環境

(前回と同じ)
WSL バージョン: 2.3.26.0
カーネル バージョン: 5.15.167.4-1
WSLg バージョン: 1.0.65
MSRDC バージョン: 1.2.5620
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26100.1-240331-1435.ge-release
Windows バージョン: 10.0.22631.4460
Rancher Desktop V1.16.0
MySQL 8.0

SpringBoot 3.3.5

VSCodeで開発を行う場合はSTSの拡張も要導入
https://spring.io/tools

POMファイルの依存ライブラリを設定

dependenciesとpluginsに必要なライブラリとプラグインを追加

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<version>3.13.0</version>
		</dependency>
		<dependency>
			<groupId>org.flywaydb</groupId>
			<artifactId>flyway-core</artifactId>
		</dependency>
		<dependency>
			<groupId>org.flywaydb</groupId>
			<artifactId>flyway-mysql</artifactId>
		</dependency>
		<dependency>
			<groupId>com.mysql</groupId>
			<artifactId>mysql-connector-j</artifactId>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.flywaydb</groupId>
				<artifactId>flyway-maven-plugin</artifactId>
			</plugin>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
 

application.properties →application.yml

application.propertiesでSpringBootとMySQLの接続設定を行う。
次のパスに格納されている。
demo\src\main\resources\application.properties
特に編集していなければまだ次の一行しか記載されていない。

spring.application.name=demo

application.propertiesのままだと扱いづらいためpropertyファイルの形式をymlに変える。
ファイル名はapplication.yml

spring:
  application:
    name: demo

VSCodeでSTSの拡張を導入している場合、application.propertiesを右クリックするとyamlに変換する項目が表示される。
image.png

MySQLへの接続設定とflywayの設定を追加する。
datasourceでは接続するDBとドライバを設定。
flywayのlocationsのフォルダにmigrationファイルを格納する。
serverの項目はアプリケーションのポートを指定している。

spring:
  application:
    name: demo
    #Spring Datasource (MySQL access info)
  datasource:
    url: jdbc:mysql://localhost:3306/mydatabase
    username: AAAA
    password: BBBB
    driver-class-name: com.mysql.cj.jdbc.Driver
    #Flyway settings
  flyway:
    locations: classpath:db/migration
    user: AAAA
    password: BBBB
    url: jdbc:mysql://localhost:3306/mydatabase
server:
  port: 3000

詳しくないうちはapplication.ymlはgitignoreファイルで追跡対象外にしてgit管理をしないことを推奨。

migrationファイルの作成

demo\src\main\resourcesdb\migrationのフォルダを作成する。
ここにmigrationファイルを格納する。
migrationファイルはファイル名に注意が必要。
今回はファイル名をV0.01__Create_city_table.sqlとする。
マイグレーションファイル名はV<VERSION>__<NAME>.sqlの形式で作成する必要がある。

--  V0.01__Create_cities_table.sql
CREATE TABLE city( 
    id BIGINT AUTO_INCREMENT PRIMARY KEY, 
    prefecture_id CHAR (2) NOT NULL, 
    code CHAR (3) NOT NULL, 
    name VARCHAR (10) NOT NULL, 
    name_kana VARCHAR (20) NOT NULL,
    kana_initial VARCHAR (20) NOT NULL
);

migration実行

アプリケーション起動時に次のようなログが表示されればmigration実行成功。

2024-12-09T19:40:13.272+09:00  INFO 29004 --- [demo] [           main] org.flywaydb.core.FlywayExecutor         : Database: jdbc:mysql://localhost:3306/mydatabase (MySQL 8.0)
2024-12-09T19:40:13.333+09:00  INFO 29004 --- [demo] [           main] o.f.core.internal.command.DbValidate     : Successfully validated 1 migration (execution time 00:00.019s)
2024-12-09T19:40:13.346+09:00  INFO 29004 --- [demo] [           main] o.f.core.internal.command.DbMigrate      : Current version of schema `mydatabase`: << Empty Schema >>
2024-12-09T19:40:13.355+09:00  INFO 29004 --- [demo] [           main] o.f.core.internal.command.DbMigrate      : Migrating schema `mydatabase` to version "0.01 - Create city table"
2024-12-09T19:40:13.403+09:00  INFO 29004 --- [demo] [           main] o.f.core.internal.command.DbMigrate      : Successfully applied 1 migration to schema `mydatabase`, now at version v0.01 (execution time 00:00.023s)

VSCodeでのアプリケーション起動方法
image.png
画面左端のアイコンのSpringBootDashboardを選択するとアプリケーション名が表示される。
起動したいアプリケーションにカーソルを合わせると▷のマークが表示され、クリックするとアプリケーションを起動できる。

エラーメッセージ:Communications link failure

docker compose up -dでコンテナを起動後、アプリケーションを起動すると次のようなエラーメッセージが表示される場合がある。

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL State  : 08S01
Error Code : 0
Message    : Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

docker compose up -dはバックグラウンドでコンテナ起動をするコマンドである。
このメッセージが表示されている原因の一つとしてコンテナの起動が完了していない状態でアプリケーションを起動すると表示される場合がある。
しばらく待って再度アプリケーション起動を行ってみてください。

補足:コンテナ内部でコマンドを実行したい、直接SQLを実行したいとき…

  1. コンテナ内に入る。
    docker compose up -dを実行したあとそのままコンソールで次のコマンドを入力する。
    今回はサービス名にdbとつけているので
    docker compose exec db bashとなる。
  2. コンテナでMySQLクライアントを立ち上げる。
    myusermydatabaseはenvファイルに記載したMySQLのユーザー名とデータベース名を入力する。
    mysql -u demouser demodatabase -p
    この後パスワードの入力が求められるのでそのままenvファイルに記載したMySQLのユーザーのパスワードを入力する。

参考

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?