para mejor example datos consultar python database connection psycopg2

python - mejor - Asegurándose de que la conexión de base de datos psycopg2 viva



psycopg2 python 3 (3)

Tengo una aplicación de python que abre una conexión de base de datos que puede colgarse en línea durante una hora, pero a veces el servidor de la base de datos se reinicia y, aunque Python aún tiene la conexión, no funcionará con OperationalError excepción OperationalError .

Así que estoy buscando cualquier método confiable para "hacer ping" a la base de datos y saber que la conexión está activa. He comprobado una documentación de psycopg2 pero no puedo encontrar nada de eso. Claro que puedo emitir algunas sentencias SQL simples como SELECT 1 y detectar la excepción, pero espero que exista un método nativo, algo como PHP pg_connection_status

Gracias.


Esta pregunta es realmente antigua, pero aún aparece en las búsquedas de Google, así que creo que es valioso saber que la instancia de psycopg2.connection ahora tiene un atributo closed que será 0 cuando la conexión esté abierta y mayor que cero cuando la conexión esté cerrada . El siguiente ejemplo debe demostrar:

import psycopg2 import subprocess connection = psycopg2.connect( dbname=database, user=username, password=password, host=host, port=port ) print connection.closed # 0 # restart the db externally subprocess.check_call("sudo /etc/init.d/postgresql restart", shell=True) # this query will fail because the db is no longer connected try: cur = connection.cursor() cur.execute(''SELECT 1'') except psycopg2.OperationalError: pass print connection.closed # 2


connection.closed no refleja una conexión cerrada / cortada por el servidor. Solo indica una conexión cerrada por el cliente usando connection.close()

Para asegurarse de que una conexión sigue siendo válida, lea la propiedad connection.isolation_level . Esto generará un error operacional con pgcode == "57P01" en caso de que la conexión esté muerta.

Esto agrega un poco de latencia para un viaje de ida y vuelta a la base de datos, pero debería ser preferible a un SELECT 1 o similar.

import psycopg2 dsn = "dbname=postgres" conn = psycopg2.connect(dsn) # ... some time elapses, e.g. connection within a connection pool try: connection.isolation_level except OperationalError as oe: conn = psycopg2.connect(dsn) c = conn.cursor() c.execute("SELECT 1")


pg_connection_status se implementa utilizando PQstatus. psycopg no expone esa API, por lo que la verificación no está disponible. Los únicos dos lugares donde se llama psycopg PQstatus en sí mismo es cuando se realiza una nueva conexión, y al comienzo de la ejecución. Entonces, sí, deberá emitir una instrucción SQL simple para averiguar si la conexión aún está allí.