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.
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')
Spécifiez une seule chaîne de connexion de style libpq:
psycopg2.connect("Host=db-0,db-1 user=user password=password dbname=data")