pgroll 、複数のスキーマバージョンを同時に提供することにより、PostgreSQLの安全で可逆的なスキーマ移行を提供するオープンソースコマンドラインツールです。データベーススキーマが更新されている間、クライアントアプリケーションが動作し続けるように、複雑な移行操作を処理します。これには、データベースをロックせずに変更が適用されること、および古いスキーマバージョンと新しいスキーマバージョンの両方が同時に機能することが含まれます(変更が行われている場合でも!)。これにより、スキーマ移行に関連するリスクが削除され、クライアントアプリケーションのロールアウトが大幅に簡素化され、インスタントロールバックも可能になります。
pgrollによって解決された問題の詳細については、入門書のブログ投稿をご覧ください。
pgroll 、物理テーブルの上にビューを使用して仮想スキーマを作成することで機能します。これにより、既存のクライアントに影響を与えることなく、移行に必要なすべての変更を実行できます。

pgroll 、拡張/契約ワークフローに従います。移行の開始時に、物理スキーマのすべての添加剤の変更(テーブルの作成、列の追加など)を壊すことなく実行します。
列に壊れた変更が必要な場合、物理スキーマに新しい列が作成され、古い列からバックフィルが作成されます。また、トリガーを構成して、アクティブな移行期間中にすべての書き込みが古い列にすべての書き込みがカウンターパートに伝播されるようにします。新しい列は、スキーマの新しいバージョンで公開されます。
開始フェーズが完了すると、新しいスキーマバージョンの準備が整い、すべてのビューを適切なテーブルと列にマッピングします。クライアントアプリケーションは、新しいスキーマバージョンにアクセスできますが、古いバージョンはまだ利用可能です。これは、クライアントアプリケーションの新しいバージョンの展開を開始する瞬間です。

クライアントアプリケーションが古いスキーマバージョンを使用していない場合、移行を完了することができます。これにより、古いスキーマが削除され、新しいスキーマが利用可能なものだけになります。不要なテーブルと列は削除されなくなり(この時点でこれを使用しているクライアントはありません)、新しいものは最終名に変更されます。ビューはまだ適切なテーブルと列にマッピングされているため、このフェーズではクライアントアプリケーションが引き続き機能します。
Linux、MacOS、Windowsでバイナリを利用できます。リリースを確認してください。
ソースからpgrollをインストールするには、次のコマンドを実行します。
go install github.com/xataio/pgroll@latest注:1.23以降に行く必要があります。
pgrollをHomeBrewにインストールするには、次のコマンドを実行します。
# macOS or Linux
brew tap xataio/pgroll
brew install pgrollこれらの手順に従って、 pgrollを使用して最初のスキーマ移行を実行します。
pgroll 、データベースに内部状態を保存する必要があります。テーブルは、現在のスキーマバージョンと保存バージョンの履歴を追跡するために作成されています。データベースを準備するには、次のコマンドを実行します。
pgroll init --postgres-url postgres://user:password@host:port/dbname移行ファイルを作成します。いくつかの例については、例フォルダーを確認できます。たとえば、この移行ファイルを使用して、新しいcustomersテーブルを作成します。
{
"name" : " initial_migration " ,
"operations" : [
{
"create_table" : {
"name" : " customers " ,
"columns" : [
{
"name" : " id " ,
"type" : " integer " ,
"pk" : true
},
{
"name" : " name " ,
"type" : " varchar(255) " ,
"unique" : true
},
{
"name" : " bio " ,
"type" : " text " ,
"nullable" : true
}
]
}
}
]
}次に、次のコマンドを実行して移行を開始します。
pgroll --postgres-url postgres://user:password@host:port/dbname start initial_migration.jsonこれにより、データベースに新しいスキーマバージョンが作成され、移行操作が適用されます(テーブルの作成)。このコマンドが終了すると、古いバージョンのスキーマ(顧客テーブルなし)と新しい(顧客テーブル付き)の両方に同時にアクセスできます。
移行を開始した後、クライアントアプリケーションは新しいスキーマバージョンの使用を開始できます。そうするためには、アクセスするように構成する必要があります。これは、 search_path新しいスキーマバージョン名( pgroll start出力によって提供)に設定することで実行できます。
SET search_path TO ' public_initial_migration ' ;古いスキーマバージョンを使用してクライアントアプリケーションがなくなったら、移行を完了することができます。これにより、古いスキーマが削除されます。移行を完了するには、次のコマンドを実行します。
pgroll --postgres-url postgres://user:password@host:port/dbname complete移行中の任意の時点で、以前のバージョンにロールバックできます。これにより、新しいスキーマが削除され、移行が始まる前の古いスキーマを残します。移行をロールバックするには、次のコマンドを実行します。
pgroll --postgres-url postgres://user:password@host:port/dbname rollbackより高度な使用法、チュートリアル、および詳細なオプションについては、ドキュメントのガイドと参照を参照してください。
一部のパフォーマンスベンチマークは、時間の経過とともにパフォーマンスを追跡するために、各コミットでmainに実行されます。各ベンチマークは、Postgres 14.8、15.3、16.4、17.0、および「最新」に対して実行されます。チャートの各行は、ベンチマークが現在10k、100k、300kの行に対して実行された行の数を表しています。
Backfill:値placeholderを使用してテキスト列を埋めるための行。バックオフなしで、バッチあたり10k行のデフォルトバッチング戦略を使用します。WriteAmplification/NoTrigger: pgrollトリガーなしでテーブルにデータを書き込むときのベースライン行。WriteAmplification/WithTrigger: rows/s pgrollトリガーが設定されたときにテーブルにデータを書き込むとき。ReadSchema:移行中に頻繁に実行されるコア関数であるread_schema関数の1秒あたりの実行回数をチェックします。ここで見ることができます。
コミュニティからの貢献を歓迎します! pgrollに貢献したい場合は、次のようなガイドラインに従ってください。
このプロジェクトのために、私たちは、オープンで歓迎的で、多様で、包括的で健康的なコミュニティに貢献する方法で行動し、対話することを誓います。
これは、インスピpgrollとして役立つプロジェクトと記事のリストです。
このプロジェクトは、Apacheライセンス2.0に基づいてライセンスされています - 詳細については、ライセンスファイルを参照してください。
質問がある場合、問題が発生した場合、または支援が必要な場合は、このリポジトリに問題を開きます。
Xataによって❤️で作られていますか?