web-dev-qa-db-ja.com

マルチホストとのpsycopg2接続

私はドッカーコンテナーに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を使用してインストールしました。

1
Batchen Regev

インストールして問題を解決しました:

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')
0
Batchen Regev

単一のlibpqスタイルの接続文字列を指定します。

psycopg2.connect("Host=db-0,db-1 user=user password=password dbname=data")
1
Laurenz Albe