web-dev-qa-db-fra.com

Connexion PSYCOPG2 avec MultiHosts

J'ai 3 serveurs DB sur des conteneurs Docker, et je me connectais comme ceci à partir de mon python App: psycopg2.connect(Host="db-0", user="user", password="password", database="data") Cela fonctionne, mais si j'ajoute plus 1 hôte il échoue .

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

mon colis est:

psycopg2-2.8.4

python3.7

pSQL 11.5 sur les conteneurs DOCKER DB-0 et DB-1 J'ai utilisé PIP Installez PSYCOPG2 à installer.

1
Batchen Regev

Résolu le problème en installant:

pip3 install postgres

et ensuite commander:

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

Et maintenant, la commande fonctionne, mais cela n'a pas vraiment roulé aux demandes de la liste des hôtes suivante. Je le faisais déjà commanté à Psycopg2 Git, j'espère un jour, ils le répareront. Alors voici mon travail autour de:

Il s'agit de tous les conteneurs DB de la requête dans une boucle et si l'un de DB retourne dans "Select pg_is_in_recovery ();" Query False, alors cela signifie que c'est le maître.

donc, tout mon insert\Supprimer\Update La requête est une fonction dans une fonction. (DEF DB_MASTER) et toutes les autres requêtes "Select" vont à la même boucle dans une fonction différente qui ne vérifie que la connexion. (DEF DB)

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

Spécifiez une seule chaîne de connexion de style libpq:

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