sqlalchemy: остановка долгосрочного запроса - PullRequest
9 голосов
/ 25 февраля 2012

У меня, казалось бы, прямолинейная ситуация, но я не могу найти простое решение.

Я использую sqlalchemy для запроса postgres. Если происходит тайм-аут клиента, я бы хотел остановить / отменить длительные запросы postgres из другого потока. Поток имеет доступ к объекту Session или Connection.

На данный момент я попробовал:

session.bind.raw_connection().close()

и

session.connection().close()

и

session.close

и

session.transaction.close()

Но что бы я ни пытался, запрос postgres все еще продолжается до конца. Я знаю это по просмотру pg в топе. Разве это не должно быть довольно легко сделать? Я что-то упустил? Разве это невозможно без получения pid и отправки сигнала остановки напрямую?

1 Ответ

7 голосов
/ 25 февраля 2012

Кажется, пока это работает хорошо:

def test_close_connection(self):
    import threading
    from psycopg2.extensions import QueryCanceledError
    from sqlalchemy.exc import DBAPIError

    session = Session()
    conn = session.connection()
    sql = self.get_raw_sql_for_long_query()

    seconds = 5
    t = threading.Timer(seconds, conn.connection.cancel)
    t.start()

    try:
        conn.execute(sql)
    except DBAPIError, e:
        if type(e.orig) == QueryCanceledError:
            print 'Long running query was cancelled.'
    t.cancel()

источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...