创build一个unit testing两个检查两个psql模式是否相同

我有一个庞大的数据库模式,有时更新这个项目。

所以我有一个名为schema.sql的文件,它具有当前的模式,还有一个包含我随着时间的推移部署的所有补丁的目录(称为patches/20160710.sql ,带有名为origin.sql的第一个模式的文件)。

如果我进行全新安装,则使用schema.sql ,否则在更新时应用此修补程序。

在更新生产模式之前,我已经在testing服务器上进行testing,而且几乎所有东西都自动完成了。 到目前为止效果很好。

不幸的是,一旦我写了一个不同的东西去schema.sql和补丁。 我的unit testing只对一个新的数据库运行,所以testing没有失败,我发现这个错误只是我在testing服务器上的补丁。

我想编写一个unit testing,它接受schema.sql ,部署它,并将模式与在origin.sql应用的所有修补程序生成的模式进行比较。

我也需要检查一些表具有相同的值。

数据库是postgresql,软件在node.js中。

Gitlab CI使用自定义的Docker镜像来运行testing,所以我真的可以用任何语言来进行testing。

当然,补丁和schema.sql都有相同的数据库名称,所以我想我必须应用schema.sql ,以某种方式转储它,然后删除数据库并从补丁重新创build它,再次转储它并比较结果。

这种方法是否有意义或有更好的方法来实现我在做什么?

如果这是有道理的,转储两个数据库并比较它们的好方法是什么?

感谢Abelisto的提示,我做了一个类似于这个脚本的脚本(我的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