同じスキーマを持つ異なるデータベース間でテーブルの差分を確認したいことがあって、テーブル毎に差分を確認するのも面倒なのでデータベースの全テーブルを比較して差分を出力するスクリプトを作った。 今後もデータのマイグレーションなどで使えそうなので、備忘として残しておく。
作ったもの
#!/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のデータベースで使用することが前提。
- 比較元のデータベースから比較対象のテーブル一覧を取得する
- テーブルごとに比較元のデータベースと比較対象のデータベースをdata-diffコマンドで比較(idカラムが存在しないテーブルは比較対象外に)
- 結果をjson形式で出力する
というシンプルなものを作成した。
取りたい情報や絞り込みたい条件がある場合は、コメントアウトしている各オプションを指定してやる。