我正在编写一个 PHP 脚本(它也使用 linux bash 命令),它将通过执行以下操作来运行测试用例:
我正在使用 PostgreSQL 数据库 (8.4.2)...
1.) 创建数据库 2.) 修改数据库 3.) 存储数据库的数据库转储 (pg_dump)
4.) 通过执行步骤 1.) 和 2.) 进行回归测试,然后获取另一个数据库转储并将其与步骤 3.) 中的原始数据库转储进行比较(差异)
但是,我发现 pg_dump 不会总是以相同的方式转储数据库。它每次都会以不同的顺序转储东西。因此,当我对两个数据库转储进行比较时,比较将导致两个文件不同,而实际上它们是相同的,只是顺序不同。
我可以采用不同的方式来执行 pg_dump 吗?
谢谢!
最佳答案
这是一个方便的预处理脚本 pg_dump
输出以使其更适合在版本控制中进行比较和存储:
https://github.com/akaihola/pgtricks
pg_dump_splitsort.py
将转储拆分为以下文件:
-
0000_prologue.sql
: 直到第一个 COPY 为止的所有内容 -
0001_<schema>.<table>.sql
.
.
NNNN_<schema>.<table>.sql
: 每个表的数据按第一个字段排序 -
9999_epilogue.sql
: 最后一个 COPY 之后的所有内容
表数据的文件已编号,因此可以使用所有文件的简单排序串联来重新创建数据库:
$ cat *.sql | psql <database>
我发现快速查看转储之间差异的一个好方法是使用 meld
整个目录上的工具:
$ meld old-dump/ new-dump/
将转储存储在版本控制中也可以很好地了解差异。以下是配置 git 以在差异中使用颜色的方法:
# ~/.gitconfig
[color]
diff = true
[color "diff"]
frag = white blue bold
meta = white green bold
commit = white red bold
注意:如果您创建/删除/重命名表,请记住删除所有.sql
后处理新转储之前的文件。
关于php - Postgres pg_dump 每次都以不同的顺序转储数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2178907/