DBマイグレーションツール Flyway

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というカラムを作るというものになります。

default

こんな感じになれば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');

えぇ、データ何入れようかなーと迷った結果バイト先の大宮駅のホーム情報でも入れとこーということで入れてみました。埼京線がないのは地下ホームだし、これ以上作るのが面倒だったから

default

では、次です。
V3__correction.sql ファイル名のcorrectionというのは"訂正"という意味です。

alter table flysample rename id to TrackNumber;

default

テーブル内で先ほどID , NAMEというカラムを作りましたがID → tracknumberにカラム名を変更しております。

さらに、行きましょう。
V4__create_mistakcolumn.sql カラムを間違えて作ったsqlです。

alter table flysample add OfficePassword_Misstake int;

default

まんまですね、flysampleというテーブルに、officepassword_mistakeというカラムを作ってしまいました。

では、前述で間違えてカラムを作ってしまいましたので消します。
V5__drop_mistakecolumn.sql

alter table flysample drop column officepassword_misstake;

default

次に、descripttionというカラムを作ります。
V6__create_descriptioncolumn.sql

alter table flysample add descripttion varchar(1034) ;

default

前述と同じです。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';

default

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)
);

default

このように、新しいテーブルを作成します。
テーブルの中にあるカラムは、tracknumber , name , pasword , descriptionの4つです。

次に、V9__new_database_insert_data.sql

INSERT INTO flysample2 (tracknumber, name, description) SELECT tracknumber, name, description FROM flysample;

とういうことになります。

default

意味としては、こんな感じでしょうか。
insert into で 新テーブル(flysample2)へデータを登録します(登録内容 : tracknumber , name , description) 。
次に、select で現在のテーブル(flysample) から (from) 各カラム(tracknumber, name ,description)内のデータを選択し flysample2で選択している各カラムにぶち込む という感じです。 (たぶん....)

ここまで終われば一通りの要件は終えられたはずなので、大丈夫だと思います。
また、バージョンに関してもFlywayのドキュメントに記載されているバージョンでの動作を確認しているので問題はありません。

誤植

V8__new_database_migration.sql 内で使用している画像の説明に誤植がありました。

× こっちはデータをデータを入れる箱だけ作ってある状態
○ こっちはデータを入れる箱だけ作ってある状態