1

1 个服务器上运行 4 个 postgresql 实例。我想同时对所有这些进行 ddl 更改。

我怎样才能做到这一点?

4

1 回答 1

3

编写一个 shell 脚本(如果你在 *nix 上)或.cmd批处理文件 / .vbs(如果你在 Windows 上)来做。让脚本调用psql -f /path/to/ddl.sql和 IP/端口、数据库名称等。

或者,使用 Python 等具有适当 PostgreSQL 绑定的语言编写脚本。让脚本循环遍历数据库并为每个数据库运行 DDL。例如,在 Python 中,以下(未经测试的)脚本应该可以解决问题:

import psycopg2
conn_definitions = [
    "dbname=db1 port=5432 host=127.0.0.1",
    "dbname=db2 port=5432 host=127.0.0.1",
    "dbname=db3 port=5432 host=127.0.0.1",
    "dbname=db4 port=5432 host=127.0.0.1",
]
ddl = """
    CREATE TABLE blah (
        blah integer
    );
    CREATE INDEX blah_blah_idx ON blah(blah);
"""
connections = []
cursors = []
for conn_info in conn_definitions:
    conn = psycopg2.connect(conn_info)
    curs = conn.cursor()
    cursors.append(curs)
    connections.append(conn)
 for curs in cursors:
    curs.execute("BEGIN;")
 for curs in cursors:
    curs.execute(ddl)
 for curs in cursors:
    curs.execute("COMMIT;")
 for conn in connections:
    conn.close()

如果需要,可以通过将 DDL 拆分为您循环的语句数组来进行增强,以便您可以执行每个语句的错误处理。

select datname from pg_database您还可以通过为每个主机连接到一个数据库并运行以获取其他数据库的列表来动态生成连接。

于 2012-09-12T08:08:29.423 回答