在1台服务器上运行4个postgresql实例。我想同时对所有这些进行ddl更改。
我该怎么做?
答案 0 :(得分:3)
编写一个shell脚本(如果你在* nix上)或.cmd
批处理文件/ .vbs
(如果你在Windows上)这样做。让脚本调用psql -f /path/to/ddl.sql
和IP /端口,数据库名称等
或者,使用具有正确PostgreSQL绑定的Python语言编写脚本。让脚本遍历数据库并为每个数据库运行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
来动态生成连接,以获取其他数据库的列表。