Como definir o tempo limite da instrução para execução da consulta

No meu aplicativo da web, algumas consultas sql do postgres levam tempo para execução. Quero definir o tempo limite da instrução para apenas parte deles.

Uma parte das consultas deve ser cancelada por tempo limite, mas outras devem funcionar sem nenhuma restriçã

o postgres existe a função statement_timeou

Como quebrar a consulta SqlAlchemy com a função statement_timeou

Como isso

SET statement_timeout TO 1000; -- timeout for one second
<sqlalchemy generated query>;
RESET statement_timeout; -- reset

Maneira perfeita para mim definir o tempo limite para consulta como este:

users = session.query(User).timeout(0.5).all()

SqlAlchemy deve: 1) definir o tempo limite da instrução 2) executar a consulta e retornar o resultado 3) redefinir o tempo limite da instrução para a sessão atual

ode haver outra maneira de definir o tempo limite para a execução da consult

UPDATE 1. Minha solução

Minha solução é um proxy de conexão personalizado (testado com psycopg2 == 2.4 e SQLAlchemy == 0.6.6):

from sqlalchemy.interfaces import ConnectionProxy

class TimeOutProxy(ConnectionProxy):
    def cursor_execute(self, execute, cursor, statement, parameters, context, executemany):

        timeout = context.execution_options.get('timeout', None)

        if timeout:
            c = cursor._parent.cursor()
            c.execute('SET statement_timeout TO %d;' % int(timeout * 1000))
            c.close()

        return execute(cursor, statement, parameters, context)


engine = create_engine(URL, proxy=TimeOutProxy(), pool_size=1, max_overflow=0)

Esta solução sem redefinir statement_timeout, porque cada consulta SqlAlchemy executada em transação isolada e statement_timeout definida dentro da transação atua

xemplo de uso (intervalo de tempo limite em segundos):

Session.query(Author).execution_options(timeout=0.001).all()

Session.bind.execute(text('select * from author;') \
      .execution_options(timeout=0.001)) \
      .fetchall()

questionAnswers(1)

yourAnswerToTheQuestion