Open3

pg-schema-diff メモ

voluntasvoluntas

stripe/pg-schema-diff: Go library for diffing Postgres schemas and generating SQL migrations

Postgres データベース スキーマ間の差異を計算し、ダウンタイムとロックを最小限に抑えながら、データベース スキーマをポイント A からポイント B に移動するために必要な SQL を生成します。これにより、データベースを取得して、プレーン DDL で定義された任意のスキーマに移行できます。

  • sqldef の PostgreSQL 特化版
  • できる事はかなり少ない

モチベーション

  • go-migrate を使っていて、差分更新がしんどかった
  • sqldef の考え方がとても良かった
    • sqldef はいまいちしっくりこなかった
  • PostgreSQL しか使わないので PostgreSQL 特化の sqldef という認識でいる
  • 機能は低いがそもそもそんなに難しい事はやらない
voluntasvoluntas

インストール

自分が RDB を使うのは PostgreSQL かつ Go かつ sqlc (pgx/v5) 経由なので Go でできてる pg-schema-diff はとても良い。

go install github.com/stripe/pg-schema-diff/cmd/pg-schema-diff@latest
voluntasvoluntas

実行

plan でどんな SQL が実行されるのかを確認することができます。

pg-schema-diff plan --dsn $POSTGRES_URL --schema-dir ./db/schema

apply で実行することができます。

pg-schema-diff apply --dsn $POSTGRES_URL --schema-dir ./db/schema

--allow-hazards

ツールは、ネイティブの postgres 移行操作を使用してオンライン移行を実行し、可能な限りロックを回避しようとします。すべての移行がロックフリーになるわけではなく、ダウンタイムが必要になる場合もありますが、その場合はハザード システムが事前に警告します。シャドウ テーブルなどのステートフル オンライン移行手法はまだサポートされていません。

https://github.com/stripe/pg-schema-diff/blob/9216a8f3c224f4861b41f07ed1d714d8d03fa94e/pkg/diff/plan.go#L12-L25

例えば --allow-hazards DELETES_DATADeletes all rows in the table (and the table itself) テーブルの全ての行も削除して、テーブル自体も削除します。

pg-schema-diff apply --dsn $POSTGRES_URL --schema-dir ./db/schema --allow-hazards DELETES_DATA