1 つのサーバーで 4 つの postgresql インスタンスが実行されています。それらすべてで同時にddlを変更したい。
これどうやってするの?
1 つのサーバーで 4 つの postgresql インスタンスが実行されています。それらすべてで同時にddlを変更したい。
これどうやってするの?
シェル スクリプト (*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 をループするステートメントの配列に分割するなどして拡張し、ステートメントごとのエラー処理を実行できるようにします。
ホストごとに 1 つの DB に接続し、実行select datname from pg_database
して他の DB のリストを取得することにより、接続を動的に生成することもできます。