php - Postgres pg_dump 每次都以不同的顺序转储数据库

标签 php database linux postgresql dump

我正在编写一个 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/

相关文章:

php - 显示可能的字符串组合

c# - ASP.NET MVC3 : Reusable method which returns Database query results

android - 当应用程序崩溃时,共享首选项会重置数据。请指导

linux - svnadmin 创建忽略目录上的粘性组位

c - 为什么 LD_PRELOAD 似乎不适用于 wc 写入

php - 教义告诉我 "new Entity was found"当我设置关系 ManyToOne 但不是

php - mod_php 与 mod_python

linux - 在 Linux 上运行程序化 Postgres 数据库迁移的最佳实践

php - MySQL DQL左连接查询排序

mysql - CREATE TABLE - 适用于 MySQL 但不适用于 Bash