私はドッカーコンテナーに3つのdbサーバーがあり、私はpython app:psycopg2.connect(Host="db-0", user="user", password="password", database="data")
からこのように接続していましたが、これは機能しますが、1つ以上のホストを追加すると失敗します。
psycopg2.connect(Host="db-0, db-1", user="user", password="password", database="data")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.7/site-packages/psycopg2/__init__.py", line 126, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: could not translate Host name "db-0, db-1" to address: Temporary failure in name resolution
私のパッケージは:
psycopg2-2.8.4
python3.7
dockerコンテナーdb-0およびdb-1上のpsql 11.5私はpip install psycopg2を使用してインストールしました。
インストールして問題を解決しました:
pip3 install postgres
次にコマンド:
psycopg2.connect(Host="db-0, db-1", user="user", password="password", database="data")
コマンドは機能しますが、実際にはリクエストを次のdb Hostリストにルーティングしません。私はすでにそれをpsycopg2 gitに入力しました、いつか彼らがそれを修正することを願っています。だからここに私の仕事があります:
ループ内のすべてのdbコンテナをクエリし、dbの1つが「SELECT pg_is_in_recovery();」で返された場合。クエリがFalseの場合、それはマスターであることを意味します。
したがって、すべての挿入\削除\更新クエリは、関数内でこれに移動します。 (def db_master)そして、他のすべての「select」クエリは、接続のみをチェックする別の関数の同じループに行きます。 (定義データベース)
import psycopg2
hosts = ["db-0", "db-1"]
for i in hosts:
conn = psycopg2.connect(
dbname=data', user='user', Host=i, password='password')
cur = conn.cursor()
cur.execute("SELECT pg_is_in_recovery();")
result = cur.fetchall()[0][0]
if result is False:
master = i
conn = psycopg2.connect(
dbname='data', user='user', Host=master, password='password')
単一のlibpqスタイルの接続文字列を指定します。
psycopg2.connect("Host=db-0,db-1 user=user password=password dbname=data")