DBマイグレーションツール Flyway
Contents
Flayway 最新バージョン
- Flyway-commandline-5.2.4 (推奨)
- flyway-commandline-6.0.0 (ベータ)
Postgraseql 対応バージョン
- Postgresql 10
- Postgresql 9.6
- Postgresql 9.5
- Postgresql 9.4
- Postgresql 9.3
Postgresql JDBC 対応バージョン
- PostgreSQL JDBC 42.2.5
Java 対応バージョン
- Java 8 / 9 / 10 / 11
DBマイグレーションツール Flyway レポート
出来ればいいなぁ
- DBに任意のテーブルを作成
- データが登録できる
- カラムの追加や削除が行える
- 登録したデータの更新が行える
- 任意行にカラムを追加できる
これらを一応念頭に入れた状態で進めていきます。
Flyway環境を構築する
おおまかな、プロセス
1.CentOSを入れる
2.postgresql9.3~ を入れる
3.flywayをwgetなりcurlなりで落としてくる
4.postgresqlへのアクセス件をtrustにしてflywayでアクセスする。
簡単そうに見えますが、データベース? なにそれおいしいの? という感じの私にとっては苦難の道のりでもありました。
ではやっていきましょう。
CentOSのインストールは飛ばします。面白いことありません。
PostgreSQLをインストールしていきます。
root@localhost ~# yum -y localinstall https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm
root@localhost ~# yum -y install postgresql10-server
root@localhost ~# /usr/pgsql-10/bin/postgresql-10-setup initdb
# データベースの初期化を行う
root@localhost ~# systemctl enbale postgresql-10
root@localhost ~# systemctl start postgresql-10
-------------------------------------------------------------------------------------------------------------------------------------------------
# 万が一firewalldとSELinux を外していない場合外しておきましょう
root@localhost ~# systemctl disable firewalld
root@localhost ~# vi /etc/sysconfig/seliux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled ←ここをdisabledに変更する
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
次に、postgresqlへflywayがアクセスするときデフォルトのconf状態だと弾かれてしまうのでアクセス権限を与えてやります。
root@localhost ~# vi /var/lib/pgsql/10/data/pg_hba.conf
後ろの方
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 trust ←trustに変更
# IPv6 local connections:
host all all ::1/128 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
host replication all 127.0.0.1/32 ident
host replication all ::1/128 ident
では、いよいよflywayを落としてきましょう
root@localhost ~# curl -O https://repo1.maven.org/maven2/org/flywaydb/flyway-commandline/5.2.4/flyway-commandline-5.2.4-linux-x64.tar.gz
一応、ダウンロードできるとは思うのですが出来ない場合はおとなしくwinscpか何かでzipを移動させときましょう。
root@localhost ~# tar xzvf flyway-commandline-5.2.4-linux-x64.tar.gz
root@localhost ~# cd lyway-5.2.4
README.txt conf drivers flyway flyway.cmd jars jre lib licenses sql
ここまで確認できたら、flywayでpostgresqlにアクセスするためにconfを書いていきます。
root@localhost ~# vi /root/lyway-5.2.4/conf/flyway.conf
# JDBC url to use to connect to the database
# Examples
# --------
# Most drivers are included out of the box.
# * = JDBC driver must be downloaded and installed in /drivers manually
# ** = TNS_ADMIN environment variable must point to the directory of where tnsnames.ora resides
# Aurora MySQL : jdbc:mysql://<instance>.<region>.rds.amazonaws.com:<port>/<database>?<key1>=<value1>&<key2>=<value2>...
# Aurora PostgreSQL : jdbc:postgresql://<instance>.<region>.rds.amazonaws.com:<port>/<database>?<key1>=<value1>&<key2>=<value2>...
# CockroachDB : jdbc:postgresql://<host>:<port>/<database>?<key1>=<value1>&<key2>=<value2>...
# DB2* : jdbc:db2://<host>:<port>/<database>
# Derby : jdbc:derby:<subsubprotocol>:<database><;attribute=value>
# H2 : jdbc:h2:<file>
# HSQLDB : jdbc:hsqldb:file:<file>
# Informix* : jdbc:informix-sqli://<host>:<port>/<database>:informixserver=dev
# MariaDB : jdbc:mariadb://<host>:<port>/<database>?<key1>=<value1>&<key2>=<value2>...
# MySQL : jdbc:mysql://<host>:<port>/<database>?<key1>=<value1>&<key2>=<value2>...
# Oracle* : jdbc:oracle:thin:@//<host>:<port>/<service>
# Oracle* (TNS)** : jdbc:oracle:thin:@<tns_entry>
# PostgreSQL : jdbc:postgresql://<host>:<port>/<database>?<key1>=<value1>&<key2>=<value2>...
# SAP HANA* : jdbc:sap://<host>:<port>/?databaseName=<database>
# SQL Server : jdbc:sqlserver:////<host>:<port>;databaseName=<database>
# SQLite : jdbc:sqlite:<database>
# Sybase ASE : jdbc:jtds:sybase://<host>:<port>/<database>
# Redshift* : jdbc:redshift://<host>:<port>/<database>
flyway.url=jdbc:postgresql://localhost/flysample ←追記
# Fully qualified classname of the JDBC driver (autodetected by default based on flyway.url)
# flyway.driver=
# User to use to connect to the database. Flyway will prompt you to enter it if not specified.
flyway.user=postgres ←追記 (postgresへログインできるユーザ名)
# Password to use to connect to the database. Flyway will prompt you to enter it if not specified.
flyway.password=toor ←追記 (postgresへログインできるユーザのパスワード)
上記でpostgresへのログインを行うパスワードが設定されていないと、アクセスが出来ないためpostgresql側でも設定を行います。
root@localhost ~# su - postgres
-bash-4.2$ psql
psql (10.7)
"help" でヘルプを表示します。
postgres=# \password postgres
新しいパスワードを入力してください: ここに新しく設定するパスワードを入れる
もう一度入力してください: パスワード再入力
postgres=#
# 最初何もないのでとりあえず データベースを作っておきます。
postgres=# create database flysample;
CREATE DATABASE
ここまでで、ようやくFlywayが動く環境がととのいました。
flywayを使うためのsqlファイルを用意する
Flywayを利用する際に、sqlファイルの命名規則があるので一応載せておきます。
頭の「V」は固定で、その後の数値がバージョン番号を表します。その後に_を2つ続けます。さらにその後ろはDescriptionとなり、
マイグレーション実行ログ(flyway info実行時に確認できる)に記録されます。
ということなので、作っていきます。
V1__create_db.sql
create table flysample (
ID int not null,
NAME varchar(100) not null
);
内容としては、flysample というテーブルを作ってカラムはIDとNAMEというカラムを作るというものになります。
こんな感じになればokです。
次に、V2__insert.sql
insert into flysample (ID, NAME) values (1, 'Keihin_1');
insert into flysample (ID, NAME) values (2, 'Keihin_2');
insert into flysample (ID, NAME) values (3, 'UT_SS_Takasaki_1');
insert into flysample (ID, NAME) values (4, 'UT_SS_Takasaki_2');
insert into flysample (ID, NAME) values (5, 'Kamotsu_1');
insert into flysample (ID, NAME) values (6, 'UT_SS_Utsunomiya_1');
insert into flysample (ID, NAME) values (7, 'UT_SS_Utsunomiya_2');
insert into flysample (ID, NAME) values (8, 'Kamotsu_2');
insert into flysample (ID, NAME) values (9, 'UT_for_Takasaki');
insert into flysample (ID, NAME) values (10, 'UT_for_Utsunomiya');
insert into flysample (ID, NAME) values (11, 'HigashiOmiya_RyuUchi');
えぇ、データ何入れようかなーと迷った結果バイト先の大宮駅のホーム情報でも入れとこーということで入れてみました。埼京線がないのは地下ホームだし、これ以上作るのが面倒だったから
では、次です。
V3__correction.sql ファイル名のcorrectionというのは"訂正"という意味です。
alter table flysample rename id to TrackNumber;
テーブル内で先ほどID , NAMEというカラムを作りましたがID → tracknumberにカラム名を変更しております。
さらに、行きましょう。
V4__create_mistakcolumn.sql カラムを間違えて作ったsqlです。
alter table flysample add OfficePassword_Misstake int;
まんまですね、flysampleというテーブルに、officepassword_mistakeというカラムを作ってしまいました。
では、前述で間違えてカラムを作ってしまいましたので消します。
V5__drop_mistakecolumn.sql
alter table flysample drop column officepassword_misstake;
次に、descripttionというカラムを作ります。
V6__create_descriptioncolumn.sql
alter table flysample add descripttion varchar(1034) ;
前述と同じです。flysampleというテーブルにdescriptionというカラムを追加しました。
型はvarcharの(1034)です。
ではいよいよ最終フェーズへ突入です。
V7__update_insertdata.sql
UPDATE flysample SET description = '京浜東北 南行 1番' WHERE tracknumber='1';
UPDATE flysample SET description = '京浜東北 南行 2番' WHERE tracknumber='2';
UPDATE flysample SET description = '上野東京ライン&湘南新宿ライン 高崎線進入 3番' WHERE tracknumber='3';
UPDATE flysample SET description = '上野東京ライン&湘南新宿ライン 高崎線進入 4番' WHERE tracknumber='4';
UPDATE flysample SET description = '貨物線 湘南新宿ライン直通' WHERE tracknumber='5';
trucknumberでupdateする行を指定し、set descriptionでupdateする項目を指定しています。
V8__new_database_migration.sql
postgresqlはカラムを追加するときに、任意の行にカラムを追加する機能を持ち合わせていません。
よって、カラムを任意の行に追加するときは新しくテーブルを作って新しいテーブルにデータをすべて移し替えなくてはいけません。
また、ここらで複雑になってきたので今一度状況を整理します。
- データベースはflysampleという名称
- また、flysampleデータベースの中に作られているテーブル名称はflysample と flysample2である。
- 任意行にカラムを追加した場合を想定し、旧テーブル(flysample)から新テーブル(flysample2)への移行を行う。
- 各カラムとデータの内容は、別勤務先であるJR大宮駅の発車番線に関連するものであるため分かりにくいとは思いますがご承知おきください。
CREATE TABLE flysample2 (
tracknumber integer NOT NULL,
name varchar(100) NOT NULL,
password integer,
description varchar(1023)
);
このように、新しいテーブルを作成します。
テーブルの中にあるカラムは、tracknumber , name , pasword , descriptionの4つです。
次に、V9__new_database_insert_data.sql
INSERT INTO flysample2 (tracknumber, name, description) SELECT tracknumber, name, description FROM flysample;
とういうことになります。
意味としては、こんな感じでしょうか。
insert into で 新テーブル(flysample2)へデータを登録します(登録内容 : tracknumber , name , description) 。
次に、select で現在のテーブル(flysample) から (from) 各カラム(tracknumber, name ,description)内のデータを選択し flysample2で選択している各カラムにぶち込む という感じです。 (たぶん....)
ここまで終われば一通りの要件は終えられたはずなので、大丈夫だと思います。
また、バージョンに関してもFlywayのドキュメントに記載されているバージョンでの動作を確認しているので問題はありません。
誤植
V8__new_database_migration.sql 内で使用している画像の説明に誤植がありました。
× こっちはデータをデータを入れる箱だけ作ってある状態
○ こっちはデータを入れる箱だけ作ってある状態