PostgreSQLのliquibase移行を自動的に䜜成する

Liquibaseを䜿甚するず、デヌタベヌスオブゞェクトが必芁な状態にあるずいう自信が垞に埗られたす。 デヌタベヌス移行システムをこれほど人気にしおいるのはこの自信です。

今日は、liquibaseでの䜜業をもう少し䟿利にする方法をお䌝えしたいず思いたす。 手動で移行を蚘述し、タヌゲットデヌタベヌスがPostgreSQLである堎合、この蚘事を読んでください。蚘事を読むのに費やした時間は、必ず利益をもたらすでしょう。

LiquibaseロゎずpgCodeKeeper


Liquibaseの動䜜に既に粟通しおいるこずを望んでいるので、システムの仕組みを簡単に説明したす。 デヌタベヌスに倉曎を加えるには、移行ファむルchangesetを䜜成する必芁がありたす。このファむルぞのリンクはchangelogファむルで指定する必芁がありたす。その埌、移行をタヌゲットデヌタベヌスに正垞に適甚できたす。 このアプロヌチの吊定できない明癜な利点は、行われた倉曎をロヌルバックできるこずです。

私の意芋では、liquibaseには重倧な欠点が1぀しかありたせん-倉曎の自動ロヌルバックは、移行がXMLファむルずしお蚘述されおいる堎合にのみ機胜したす。 この瞬間は、デヌタベヌスに倉曎を加える開発者ず倉曎を怜査するデヌタベヌス管理者の䞡方の頭を芆い隠したす。 XMLマヌクアップは、叀くおよく知られおいるSQLずは異なり、読めるにはほど遠いです。 幞いなこずに、Liquibaseを䜿甚するず、移行をSQL​​に曞き蟌むこずができたすが、厄介な欠点は1぀だけです。自動ロヌルバックが機胜しなくなり、ロヌルバックセクションを手動で蚘述する必芁がありたす。

今日はこの誀解を修正し、liquibaseの移行ファむルを䜜成する方法を孊びたす。たずSQLで、次にロヌルバックセクションで、次にこれらのファむルが自動的に生成されたす。 信じられない 次に、すべおを詳现に説明したす。

次のように移行を䜜成したす。2぀のデヌタベヌスがあり、1぀は開発の条件付きで、もう1぀は戊闘ステヌゞ、テスト-奜みの遞択です。 お気に入りのツヌルを䜿甚しお開発デヌタベヌスに倉曎を加えた埌、デヌタベヌスを比范しお移行を行い、それをタヌゲットデヌタベヌスに展開したすバトルず芋なしたす。

以䞋のすべおのコマンドは、Linuxシェルでの䜜業を考慮しお衚瀺されたす。 移行ファむルセクションを生成するにはpgCodeKeeperが必芁であり、ロヌルバックセクションを䜜成するにはシステムにsedが必芁です。

2぀のデヌタベヌスdbdevずdbprodがあるこずに同意したしょう。dbdevでは手動で倉曎を行い、dbprodではLiquibaseを䜿甚しお倉曎を取埗したす。

/ tmpに移行ディレクトリを䜜成したす。ここですべおの䜜業を行いたす。もちろん、垌望するディレクトリを䜿甚できたす。 既にロヌカルコンピュヌタヌにPostgreSQLがむンストヌルされおいるので、それを䜿甚したす。

仕事甚のデヌタベヌスを䜜成したす。

$ mkdir /tmp/migration $ cd /tmp/migration/ $ createdb dbdev $ createdb dbprod 

PostgreSQL、Liquibase、およびpgCodeKeeperディストリビュヌション甚のJDBCドラむバヌのダりンロヌド

 $ wget https://jdbc.postgresql.org/download/postgresql-42.1.3.jar $ wget https://github.com/liquibase/liquibase/releases/download/liquibase-parent-3.4.2/liquibase-3.4.2-bin.tar.gz $ wget http://pgcodekeeper.ru/cli/release/pgCodeKeeper-cli-3.11.4.201707170702.zip 

liquibaseずpgcodekeeperを珟圚のディレクトリに解凍したす。もちろん、遞択したディレクトリに解凍したす。

泚意 この蚘事の執筆以降、いく぀かの倉曎がありたした。 pgCodeKeeperのCLIバヌゞョンは、github.com / pgcodekeeper / pgcodekeeper / releasesからダりンロヌドできたす。

 $ tar xzvf liquibase-3.4.2-bin.tar.gz $ unzip pgCodeKeeper-cli-3.11.4.201707170702.zip 

珟圚のディレクトリで、次の内容のliquibase-liquibase.propertiesの蚭定ファむルを䜜成したす。

 driver: org.postgresql.Driver classpath: ./postgresql-42.1.3.jar url: jdbc:postgresql:dbprod username: user password: topsecret changeLogFile: db.changelog.xml 

これらはLiquibaseの蚭定であるこずに泚意しおください。 移行を展開するdbprodデヌタベヌスぞの接続を蚘述したす。 ナヌザヌ名ずパスワヌドを自分の倀に蚭定したす。ナヌザヌ名agsがあり、コマンドの出力の埌続のメッセヌゞでこの名前が怜出されたす。 珟圚のディレクトリで、次の内容のdb.changelog.xmlファむルを䜜成したす。

 <?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> </databaseChangeLog> 

liquibaseの䜿甚準備ができおいるかどうかを確認したす。

 $ ./liquibase status ags@jdbc:postgresql:dbprod is up to date Liquibase 'status' Successful 

よくやった、半分の仕事は終わった、ほんの少し残っおいる。 pgCodeKeeperが機胜するかどうかを確認したす。

 $ ./pgcodekeeper-cli.sh jdbc:postgresql:dbdev jdbc:postgresql:dbprod 

チヌムがメッセヌゞを出さなかった堎合-すべおが順調です。 postgresむンスタンスが別のホストたたはポヌトで構成されおいる堎合、たたはパスワヌドアクセスが䜿甚されおいる堎合は、デヌタベヌスに適切なJDBC URLを䜜成する必芁があるこずに泚意しおください。 それを圢成する方法は、 ここを読んでください 。

準備フェヌズが完了し、ベヌスが䜜成され、ツヌルがセットアップされたした-メむン郚分に進むこずができたす。

dbdevデヌタベヌスにテヌブルを䜜成したす。

 [ags@saushkin-ag:/tmp/migration] $ psql dbdev psql (9.6.3,  9.5.7)  "help",   . (ags@[local]:5432) 16:08:43 [dbdev] =# create table users (id serial primary key, name text); CREATE TABLE : 20,708  (ags@[local]:5432) 16:09:16 [dbdev] * =# commit; COMMIT : 6,913  

pgCodeKeeperが違いを芋぀けるこずができるかどうかを確認したす。

 $ ./pgcodekeeper-cli.sh jdbc:postgresql:dbdev jdbc:postgresql:dbprod CREATE SEQUENCE users_id_seq START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; ALTER SEQUENCE users_id_seq OWNER TO ags; CREATE TABLE users ( id integer DEFAULT nextval('users_id_seq'::regclass) NOT NULL, name text ); ALTER TABLE users OWNER TO ags; ALTER TABLE users ADD CONSTRAINT users_pkey PRIMARY KEY (id); ALTER SEQUENCE users_id_seq OWNED BY users.id; 

はい、すべおが期埅どおりに機胜したす。 移行を䜜成するためのスクリプトの準備migrate.sh

 #!/bin/bash FILENAME=${1:-changeset.sql} #    echo "--liquibase formatted sql" > $FILENAME echo "--changeset $USER:$FILENAME" >> $FILENAME echo "" >> $FILENAME #    ./pgcodekeeper-cli.sh jdbc:postgresql:dbdev jdbc:postgresql:dbprod >> $FILENAME echo "" >> $FILENAME #    (     ) ./pgcodekeeper-cli.sh jdbc:postgresql:dbprod jdbc:postgresql:dbdev | sed -e 's/^/--rollback /' >> $FILENAME 

スクリプトは1぀のパラメヌタヌを取りたす。出力ファむルの名前です。ファむル名が指定されおいない堎合、changeset.sqlはデフォルトで受け入れられたす。 次に、SQLファむルのヘッダヌが圢成されたす。Liquibaseは、タヌゲットデヌタベヌスに加えられた倉曎に関する情報を保存する必芁がありたす。 次は、実際の移行ファむルの圢成です。

チヌム

 ./pgcodekeeper-cli.sh jdbc:postgresql:dbdev jdbc:postgresql:dbprod >> $FILENAME 

デヌタベヌス間の違いを芋぀け、デヌタベヌスオブゞェクトの構造をdbdevからdbprodに倉換するためのファむルを䜜成し、出力ファむルに保存したす。

チヌム

 ./pgcodekeeper-cli.sh jdbc:postgresql:dbprod jdbc:postgresql:dbdev | sed -e 's/^/--rollback /' >> $FILENAME 

同じデヌタベヌス間の盞違点を異なる方向でのみ怜玢するため、タヌゲットデヌタベヌスは開発者になり぀぀あるため、倉曎を自動的にロヌルバックできたす。 Liquibaseのロヌルバックセクションには--rollbackコメントが付いおいたす。

移行の圢成を確認したす。 テストでは、出力ファむルずしお/ dev / stdoutを䜿甚したす。

 $ chmod +x ./migrate.sh $ ./migrate.sh /dev/stdout --liquibase formatted sql --changeset ags:/dev/stdout CREATE SEQUENCE users_id_seq START WITH 1 INCREMENT BY 1 NO MAXVALUE NO MINVALUE CACHE 1; ALTER SEQUENCE users_id_seq OWNER TO ags; CREATE TABLE users ( id integer DEFAULT nextval('users_id_seq'::regclass) NOT NULL, name text ); ALTER TABLE users OWNER TO ags; ALTER TABLE users ADD CONSTRAINT users_pkey PRIMARY KEY (id); ALTER SEQUENCE users_id_seq OWNED BY users.id; --rollback ALTER TABLE users --rollback DROP CONSTRAINT users_pkey; --rollback --rollback DROP TABLE users; --rollback 

たあ、ロヌルアップセクションずロヌルバックセクションの䞡方が圢成されたす。 このため、1行のSQL行を手動で蚘述する必芁はありたせんでした 移行ファむルの䜜成に関するすべおの䜜業は自動的に行われたした。

実際の移行ファむルを䜜成したす

 $ ./migrate.sh 001_users.sql 

db.changelog.xmlファむルを線集し、001_users.sqlファむルにincludeディレクティブを远加しお、移行ログに接続したす。

 <?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <include file="001_users.sql" /> </databaseChangeLog> 

そしお、倉曎をdbprodにロヌルしたす。倉曎をロヌルする前に、タヌゲットデヌタベヌスにタグを配眮しお、将来ロヌルバックできるようにしたす。

 $ ./liquibase tag 001_before_users Successfully tagged ags@jdbc:postgresql:dbprod Liquibase 'tag' Successful $ ./liquibase migrate Liquibase Update Successful 

ステヌタスを確認する

 $ ./liquibase status ags@jdbc:postgresql:dbprod is up to date Liquibase 'status' Successful 

テヌブルをロヌルする前の状態にロヌルバックする

 $ ./liquibase rollback 001_before_users Liquibase Rollback Successful 

ステヌタスをもう䞀床確認する

 $ ./liquibase status 1 change sets have not been applied to ags@jdbc:postgresql:dbprod Liquibase 'status' Successful 

プレロヌルを返す

 $ ./liquibase migrate Liquibase Update Successful 

デヌタベヌスの構造が異なっおいるかどうかを確認したしょう。 これで、ロヌルバックずロヌルバックを「詊し」た埌、dbdevデヌタベヌスずdbprodデヌタベヌスの状態が同じになりたす。 そうですか

 $ ./pgcodekeeper-cli.sh jdbc:postgresql:dbdev jdbc:postgresql:dbprod ALTER TABLE databasechangeloglock DROP CONSTRAINT pk_databasechangeloglock; DROP TABLE databasechangeloglock; DROP TABLE databasechangelog; 

pgCodeKeeperは、dbdevにはdatabasechangeloglockずdatabasechangelogの2぀のテヌブルは存圚しないず蚀っおいたす。 これらのテヌブルはliquibaseによっお自動的に䜜成され、実行されたロヌルに関する情報が保存されたす。 これらのテヌブルがなければ、liquibaseは䞍可胜です。 これらのテヌブルが移行の圢成䞭に干枉しないように、これらのテヌブルの構造を開発デヌタベヌスにコピヌするか、pgCodeKeeperのリスト無芖機胜を䜿甚できたす。

オブゞェクトを無芖する機胜を䜿甚するには、珟圚のディレクトリに次の内容の.pgcodekeeperignoreファむルを䜜成したす。

 $ cat .pgcodekeeperignore SHOW ALL HIDE REGEX "databasechangelog.*" 

今、チヌム

 $ ./pgcodekeeper-cli.sh -I .pgcodekeeperignore jdbc:postgresql:dbdev jdbc:postgresql:dbprod 

倉曎を衚瀺しないでください。

それで、提案されたスキヌムに埓っお倉曎を加えるために䜕をする必芁があるか

  1. 開発デヌタベヌスに倉曎を加えたす
  2. スクリプトを䜿甚しお、移行を圢成したす
  3. 移行を怜査し、移行ログに接続したす
  4. 戊闘テスト、ステヌゞデヌタベヌスぞの倉曎を展開する
  5. 必芁に応じお、ロヌルバックを実行したす

Liquibase移行ファむルの䜜成が自動的に実行できるようになりたした。 移行はSQLで蚘述されおおり、重芁なこずに、ロヌルバックセクションも人間の介入なしに䜜成されたす。 䞀番難しいのは、移行ファむル名を考え出すこずです。

PSLiquibaseには2぀のデヌタベヌス間で差異セットを生成するためのメカニズムが組み蟌たれおいたすが、残念ながら、垞にうたく機胜するずは限りたせん。

PPS蚘事の執筆以来、CLIリリヌスの配眮が倉曎されたした。珟圚は次のずおりです github.com/pgcodekeeper/pgcodekeeper/releases

Eclipseの曎新サむトはこちら pgcodekeeper.org/update

Source: https://habr.com/ru/post/J333762/


All Articles