如何在 Python (psycopg2) 中获得 pg_dump -s <dbname> 的等价物?

How to get the equivalent of pg_dump -s <dbname> in Python (psycopg2)?

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

比较应该只检查模式而不是数据。

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

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

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

两个问题

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

谢谢!

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

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

直接调用

但是,如果您想找出其他类型的差异,则可以(如果不是涉及更多的话)通过 psycopg2 通过查询各种 system catalog 个表格。

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