我正在编写一个PHP脚本(它也使用linux bash命令),它将通过执行以下操作来运行测试用例:
我使用的是PostgreSQL数据库(8.4.2)...
1.)创建一个数据库2。)修改数据库3。)存储DB的数据库转储(pg_dump)
4.)通过执行步骤1进行回归测试。)和2),然后获取另一个数据库转储,并将其与步骤3中的原始数据库转储进行比较(diff)。)
然而,我发现pg_dump并不总是以同样的方式转储数据库。它每次都会以不同的顺序转储内容。因此,当我对两个数据库转储文件进行比较时,将导致两个文件不同,而实际上它们是相同的,只是顺序不同。
有没有其他方法可以让我开始做pg_dump?
谢谢!
发布于 2010-02-02 03:02:55
强制pg_dump以任何特定的顺序转储数据是不可能的,因为它是按磁盘顺序转储数据的-这种方式要快得多。
您可以对pg_dump使用"-a -d“选项,然后对输出进行”排序“,但是数据中的换行符将使排序后的输出不可用。但对于基本的比较,无论有什么变化,都足够了。
发布于 2010-04-22 15:00:22
下面是一个方便的脚本,用于预处理pg_dump输出,使其更适合在版本控制中进行区分和存储:
https://github.com/akaihola/pgtricks
pg_dump_splitsort.py将转储拆分为以下文件:
0000_prologue.sql:直到第一个COPY0001_<schema>.<table>.sql为止的所有内容。
。
NNNN_<schema>.<table>.sql:每个表的数据,按first field
9999_epilogue.sql:最后一次拷贝后的所有内容排序表数据的文件是有编号的,因此可以使用所有文件的简单排序连接来重新创建数据库:
$ cat *.sql | psql <database>我发现一个快速查看转储之间差异的好方法是在整个目录上使用meld工具:
$ meld old-dump/ new-dump/将转储存储在版本控制中也可以很好地了解其中的差异。下面是如何配置git以在diffs中使用颜色:
# ~/.gitconfig
[color]
diff = true
[color "diff"]
frag = white blue bold
meta = white green bold
commit = white red bold注意:如果您已经创建/删除/重命名了表,请记住在对新转储进行后处理之前删除所有.sql文件。
发布于 2010-02-02 03:16:39
这里有必要区分模式和数据。模式以相当确定的顺序转储,大多数对象按字母顺序排列,受对象间依赖关系的约束。在一些有限的情况下,顺序不是完全约束的,对于外部观察者来说可能是随机的,但这可能会在下一个版本中得到修复。
另一方面,数据按磁盘顺序转储。这通常是您想要的,因为您希望转储速度快,并且不会使用大量的资源来进行排序。您可能会观察到,当您“修改DB”时,您正在进行更新,这实际上会删除旧值并将新值附加到末尾。这当然会打乱你的diff策略。
一个可能更适合您的目的的工具是pg_comparator。
https://stackoverflow.com/questions/2178907
复制相似问题