データベース間のテーブル差分を比較するスクリプトを作成した

同じスキーマを持つ異なるデータベース間でテーブルの差分を確認したいことがあって、テーブル毎に差分を確認するのも面倒なのでデータベースの全テーブルを比較して差分を出力するスクリプトを作った。 今後もデータのマイグレーションなどで使えそうなので、備忘として残しておく。

作ったもの

#!/bin/bash

BASE_DB_URL="postgresql://user:password@host:5432/db_name" # 比較元のDBのURL
TARGET_DB_URL="postgresql://user:password@host:5432/db_name" # 比較対象のDBのURL
TABLES=`psql "$BASE_DB_URL" -t -A -F"," -c "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';"`

while IFS="," read -r TABLE_NAME
do
  echo "=== $TABLE_NAME ==="

  data-diff \
  "$BASE_DB_URL" \
  "$TABLE_NAME" \
  "$TARGET_DB_URL" \
  "$TABLE_NAME" \
  -k id \
  --json || { echo "idカラムが存在しないテーブルです"; continue; }
  # -d \ # デバッグ情報の表示
  # -v \ # 詳細情報の表示
  # -c activity \ # その他の比較対象にするカラム
  # -w "event_timestamp < '2022-10-10'" # where句を指定
done <<EOD
$TABLES
EOD

data-diffというテーブル同士の差分を比較するツールに、データベース間のテーブル同士の差分を確認する機能もあったので、それを活用した。 今回はPostgreSQLのデータベースで使用することが前提。

  1. 比較元のデータベースから比較対象のテーブル一覧を取得する
  2. テーブルごとに比較元のデータベースと比較対象のデータベースをdata-diffコマンドで比較(idカラムが存在しないテーブルは比較対象外に)
  3. 結果をjson形式で出力する

というシンプルなものを作成した。

取りたい情報や絞り込みたい条件がある場合は、コメントアウトしている各オプションを指定してやる。

参考

data-diff公式ドキュメント