読者です 読者をやめる 読者になる 読者になる

Tips

IT技術系Tips

sqliteのDBを比較するスクリプトを書いた

諸事情でgithubからは消してたけど復活させた。
DBを使うテストなんかで呼び出す。

結果を標準出力にテーブル単位で出力して、差があるようならdiff.dbにレコード単位で保存。
実行すると、データに差がなければOK、差があればNGって出る。

+--------------------------------+--------------------------------+--------+
| old_tbl                        | new_tbl                        | status |
+--------------------------------+--------------------------------+--------+
| t060_filtering_collate_history | t060_filtering_collate_history |   OK   |
| t022_text                      | t022_text                      |   OK   |
| t027_alias_num                 | t027_alias_num                 |  *NG*  |
| t013_num                       | t013_num                       |   OK   |
+--------------------------------+--------------------------------+--------+

インストール

ライブラリを入れる。

pip install prettytable

githubからソースを持ってくる。
github.com

sqliteも入れてパスを通すかsqlite_diff.pyと同じディレクトリに置く。
windowsならsqlite-tools-win32-x86-xxxxxxxxx.zipってやつ。
SQLite Download Page

使い方

a.dbとb.dbを比較して、どのテーブルのどのデータに差分があるのか調べる。

python sqlite_diff.py A.db B.db


列を無視して比較。
全てのテーブル共通で更新日がある場合なんかに使う。

python sqlite_diff.py A.db B.db --ignore modified


テーブルごとに無視する列を決める。
テーブル名:列名のフォーマット。

python sqlite_diff.py A.db B.db --ignore-tbl-col test:id


テスト対象外としたいテーブルがある場合。

python sqlite_diff.py A.db B.db --ignore-tbl test


PKを指定する。
テーブル内のデータ同士はPKを使って比較するので、PK制約はサロゲートキーであるidに貼ってあるけど、ほんとはparent_table_id,cif_person_id,black_pkで一意になるってことならこうする。

python sqlite_diff.py A.db B.db --ignore id collate_date --unique t063_filtering_collate_result:parent_table_id,cif_person_id,black_pk

余談

sqliteダウンロードしたら、「sqldiff.exe」ってのが付いてたんだけど、これってもしかして
ここで紹介してるsqlite_diff.pyとかぶってる?