Pregunta

¿Cómo uno va sobre la cancelación de la ejecución de una instrucción de consulta utilizando pyscopg2 (Postgres el controlador pitón)?

A modo de ejemplo, digamos que tengo el siguiente código:

import psycopg2
cnx_string = "something_appropriate"

conn = psycopg2.connect(cnx_string)
cur = conn.cursor()
cur.execute("long_running_query")

A continuación, quiero cancelar la ejecución de esa consulta larga que va desde otro hilo -? Qué método tendría que recurrir a los objetos de conexión / cursor para hacer esto

¿Fue útil?

Solución

Puede cancelar una consulta llamando a la pg_cancel_backend(pid) función PostgreSQL en una conexión separada.

Puede saber el PID del backend para cancelar desde el connection.get_backend_pid() método de psycopg2 (disponible de versión 2.0.8).

Otros consejos

Soporte de ejecución asíncrono de psycopg2 ha sido eliminado .

Si puede utilizar py-PostgreSQL y su (que es py3k), la implementación interna es asíncrona y apoyos que se interrumpió.

El objeto de conexión tiene un miembro de cancelar. El uso de este y con hilo podría utilizar

sqltimeout = threading.Timer(sql_timeout_seconds, conn.cancel)
sqltimeout.start()

Cuando el tiempo se agota, la cancelación se envía a la conexión y una excepción será levantado por el servidor. No se olvide de cancelar el temporizador cuando la consulta termina normalmente ....

sqltimeout.cancel()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top