【问题标题】:How to get the equivalent of pg_dump -s <dbname> in Python (psycopg2)?如何在 Python (psycopg2) 中获得 pg_dump -s <dbname> 的等价物?
【发布时间】:2015-03-12 21:49:43
【问题描述】:

我的任务是将 Postgres 中应用集群中的多个数据库的架构与不同版本应用的相同数据库进行比较。

比较应该只检查架构而不是数据。

最基本的方法是我使用子进程来执行

    pg_dump -U <user> -s <database> > schema.txt

对于每个数据库,然后运行一个差异。

两个问题

1) 这是查看架构是否已更改的正确方法吗? 2) 这是否可以通过 psycopg2 实现,而不使用 subproccess 或 pg_dump 或 psql?

谢谢!

【问题讨论】:

    标签: python postgresql psycopg2


    【解决方案1】:

    这取决于架构是否已更改的含义。如果从字面上看,这意味着模式之间是否存在 任何 差异,无论多么重要,那么是的,您会想要转储模式然后比较它们。

    对于此任务,您肯定希望将pg_dump--schema-only 选项一起使用。没有执行此操作的 SQL 语句,因此无法直接通过 psycopg2 执行此操作。 (有可用的低级 Postgres 库函数允许像 PgAdmin3 这样的程序显示表等的所有 DDL,但我相信需要通过libpq直接调用)。

    但是,如果您想找出其他类型的差异,则可以通过 psycopg2 查询各种system catalog 表来完成(如果不是更多的参与) .

    例如,您可以查询pg_tables 以确定存在哪些表,然后比较这些表以查看是否缺少任何表。然后,您可以直接查询这些表以获取更多信息,例如,检查计数是否相同等。

    【讨论】:

    • 感谢您的回复。我基本上得出了相同的结论,并将使用 pg_dumpall -s。现在的问题是如何正确比较 2 个 50k 行的文件,这些文件的顺序可能不同。
    • 当然,没问题。如果您在比较时遇到问题,请随时为此发布一个新问题。我对如何做到这一点有一些想法。
    猜你喜欢
    • 2023-03-28
    • 2022-10-17
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2013-02-06
    • 2012-03-22
    相关资源
    最近更新 更多