今パートの目標
前回はデータベース接続の第一弾としてPostgresqlJDBCドライバーとSpringDataJpaをインストールし、SpringBootからデータベース操作ができる環境を整えました。
今回はSpringBoot3✖️FlyWayでPostgresqlDBのマイグレーションを作成し、SpringBootからテーブルデータを取得するところまで実施していきたいと思います。
ユーザーテーブルを定義する
マイグレーションを作成する前に今回作成するユーザーテーブルの定義を考えていきたいと思います。
項目名 | カラム名 | データ型 | 制約 | 初期値 | 説明 |
ID | id | bigserial | PRIMARY KEY | ユーザーを一位に特定する識別子。連番。 | |
ユーザー名 | username | varchar(50) | PRIMARY KEY | ユーザー名 | |
メールアドレス | varchar(255) | NOT NULL | メールアドレス | ||
パスワード | password | varchar(72) | NOT NULL | パスワード | |
認証フラグ | activated | boolean | NOT NULL | false | メールアドレスが認証済みかどうか |
作成日時 | created_at | timestamp | NOT NULL | 現在日時 | レコード作成日時 |
更新日時 | updated_at | timestamp | NOT NULL | 現在日時 | レコード更新日時 |
簡単に説明します。
データ型
bigserial
連番を意味する型です。
連番型は正確にはデータ型ではなく、テーブルの列に一意の識別子を作成する簡便な表記法です。
内部的には以下のように整数列を作成し、その列のデフォルト値が連番ジェネレータから割り当てられるように割り当てられます。
CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;
varchar
文字を意味する型です。
varchar型は上限付き可変長の型で、括弧内で指定した数字を上限文字数として文字列を保持できます。
可変長の意味は固定長のchar型と比較するとわかりやすいです。
例えばvarchar(50)とchar(50)のカラムがあり、10文字のデータを保持したい場合、varchar型の場合は10文字で保持しますが、char型の場合は10文字+40文字の空白文字の50文字として保持します。
boolean
真偽値(true or false)を意味する型です。
timestamp
日付と時刻を意味するデータ型です。
▼参考
制約
PRIMARY KEY
非NULLかつユニークなカラムとなる主キーを意味する制約です。
内部的には「NOT NULL」と「UNIQUE」を付与しているのと同じです。
NOT NULL
非NULLを意味する制約です。
カラムがNULLになることは無く、必ず値が入るようにするという意味です。
UNIQUE
一意性を意味する制約です。
テーブル内の全ての行でデータが一意であることを確実にします。
▼参考
Flywayでマイグレーションを作成する
DBマイグレーションとは
「マイグレーション (Migration)」とは、「移行」 を意味します。
例えば、SpringBoot2からSpringBoot3へ移行することなどもマイグレーションと言い、Migration-Guideというものも提供されています。
▼参考
DBマイグレーションとはデータベースのスキーマ変更をバージョン管理し、新旧の状態に移行させるプロセスのことを言います。
つまりマイグレーションを作成することによって、対象のバージョンの状態までデータベースの状態を戻したり進めたりすることができます。
Flywayを追加する
build.gradleにFlywayライブラリとプラグインを追加します。を追加します。
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.0'
id 'io.spring.dependency-management' version '1.1.4'
}
group = 'com.pandaman'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.flywaydb:flyway-core'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'org.postgresql:postgresql'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
bootRun {
jvmArgs project.findProperty('debug') ?: ''
}
implementation 'org.flywaydb:flyway-core'
これを追加することでSpringBoot起動時に自動でマイグレーションファイルを実行してくれるようになります。
マイグレーションファイルを作成する
マイグレーションファイルとはデータベースのスキーマ変更を管理するためのスクリプトです。
以下のフォルダ配下に作成していきます。
- src
└ main
└ resources
└ db
└ migration
└ V1.1__Create_users_table.sql
ファイル名の命名規則についてはドキュメントを参考にして名付けます
# <Prefix><Version>__<Description>.sql
V1.1__Create_users_table.sql
Flyway が扱うマイグレーションには以下3種類があるのですが、主にVersioned Migrationsを使用していきます。
Versioned Migrationsは prefix に付与したバージョンの番号の順番通りに適用されるようなマイグレーションファイルのことです。
- Versioned Migrations
- Undo Migrations
- Repeatable Migrations
詳細は以下ドキュメントを参照してください。
マイグレーションファイルを編集する
マイグレーションファイルには実行したいSQLを記載します。
今回は先ほど定義したユーザーテーブルを作成するSQLを記載していきます。
CREATE TABLE users(
id bigserial PRIMARY KEY
,username varchar(50) NOT NULL UNIQUE
,email varchar(255) NOT NULL
,password varchar(72) NOT NULL
,activated boolean NOT NULL DEFAULT 'false'
,created_at timestamp NOT NULL DEFAULT current_timestamp
,updated_at timestamp NOT NULL DEFAULT current_timestamp
);
マイグレーションを実行する
それではマイグレーションを実行しましょう。
以下コマンドでSpringBootを起動するだけです。
share-favplace-api % docker-compose up -d
無事起動できたら、usersテーブルが作成されていることを確認しましょう。
http://localhost:8888/login
にアクセスし、pgadmin4へログインします。
データベースを確認すると、2つのテーブルが作成されていることがわかると思います。
flyway_schema_historyというテーブルはflywayがバージョン管理をするために自動で作成するテーブルです。
中身を見るとそれらしきレコードが保存されていると思います。
以上でデータベースのマイグレーションができました。
まとめ
Flywayを使用してマイグレーションを作成することができました。
データベースの移行状態の管理を自動化することで快適に開発ができるようになりました。
ここまででデータベース編の準備が完了したので次回は遂にデータベースからデータを取得して、フロントエンドで表示するところまでやってみたいと思います。
コメント