2016-07-10 3 views
1

このプロジェクトには巨大なdbスキーマが含まれていますが、これは時々更新されます。ユニットテストを作成する2つのpsqlスキーマが同じであるかどうかチェック

私はschema.sqlというファイルを持っています。これは現在のスキーマを持ち、patches/20160710.sqlと呼ばれ、origin.sqlという名前のファイルを持つ、すべてのパッチがあるディレクトリです。

新しいインストールを行う場合は、schema.sqlを使用します。それ以外の場合は、更新を行うときにパッチを適用します。

私は、プロダクションでスキーマを更新する前にテストを行い、ほぼすべてを自動化しました。これまでのところうまくいきます。

残念ながら私は別のものを書きましたschema.sqlとパッチで行ってください。私の単体テストは新しいデータベースに対してのみ実行されるので、テストは失敗せず、エラーを見つけました。テストサーバーにパッチを試しました。

schema.sqlというユニットテストを作成して展開し、origin.sqlに適用されたすべてのパッチで生成されたスキーマとスキーマを比較したいと思います。

私はまた、いくつかのテーブルが同じ値を持っていることを確認する必要があります。

データベースはpostgresqlで、ソフトウェアはnode.jsにあります。

テストはGitlab CIでカスタムドッカーイメージを使用して実行されるため、どの言語であれテストを行うことができます。

両方のパッチとschema.sqlはもちろんデータベースと同じ名前なので、schema.sqlを適用して何らかの方法でダンプしてから、データベースを削除してパッチから再作成し、再度ダンプして比較します結果。

このアプローチは意味をなさないか、私がやっていることを達成するためのより良い方法がありますか?

2つのデータベースをダンプして比較するにはどうすればよいでしょうか?

+1

コマンドラインをLinuxの 'pg_dumpの<接続のためにparams 1> --schema = <比較するスキーマ> --schema-only> foo1.sql && pg_dump <接続パラメータ2> --schema = <比較するスキーマ> --schema-only> foo2.sql && diff foo1。 sql foo2.sql'。出力が空の場合、スキームは同一です。データを比較するには、 'psql -c" "> data1.txt && psql -c" "> data2.txt && diff data1.txt data2.txt'のようになります。 – Abelisto

+0

@Abelistoはヒントのために感謝します。 2つのスキーマが同じ名前を持つのはどうですか?テスト環境で2番目のスキーマの名前を変更するbashスクリプトを記述するのがよいでしょうか? – rpadovani

+0

あなたはそれが単なるヒントであったと言います。どのように使用するかはあなた次第です。いずれにしても、bashとPostgreSQLのコマンドラインツールを使って、ほとんど何でもできると思います。 – Abelisto

答えて

1

おかげヒントAbelistoさんに、私はこの1つのようなスクリプトを作った(私はbash-FUがあまりよくないので、それを改善して自由に感じる):

#!/bin/bash 
ORIGINAL_DB="tmp1" 
INCREMENTAL_DB="tmp2" 
SCHEMA="schema" 

function clean_up { 
    sudo -u postgres dropdb ORIGINAL_DB 
    sudo -u postgres dropdb INCREMENTAL_DB 
    sudo -u postgres createdb ORIGINAL_DB 
    sudo -u postgres createdb INCREMENTAL_DB 
} 

function import_schemas { 
    sudo -u postgres psql ORIGINAL_DB < database/sql/schema.sql 

    for f in database/sql/patches/*.sql ; do 
    [[ -f "$f" ]] || continue 
    sudo -u postgres psql INCREMENTAL_DB < $f 
    done 
} 

function compare_schemas { 
    sudo -u postgres pg_dump ORIGINAL_DB --schema=SCHEMA --schema-only > foo1.sql 
    sudo -u postgres pg_dump INCREMENTAL_DB --schema=SCHEMA --schema-only > foo2.sql 
    line_diff=$(diff foo1.sql foo2.sql | egrep '^<|>' | wc -l) 

    if [ $line_diff -ne 0 ] 
    then 
    diff foo1.sql foo2.sql 
    exit -1 
    fi 
} 

function compare_values { 
    sudo -u postgres psql ORIGINAL_DB -c "SELECT * FROM roles_permissions ORDER BY idrole, idpermission;" > data1.txt 
    sudo -u postgres psql INCREMENTAL_DB -c "SELECT * FROM roles_permissions ORDER BY idrole, idpermission;" > data2.txt 

    line_diff=$(diff data1.txt data2.txt | egrep '^<|>' | wc -l) 

    if [ $line_diff -ne 0 ] 
    then 
    exit -1 
    fi 
} 

clean_up 
import_schemas 
compare_schemas 
compare_values 

exit 0 
関連する問題