sqlalchemy:停止长时间运行的查询

Cod*_*ngo 9 python django postgresql sqlalchemy

我有一个看似直截了当的情况,但无法找到一个直截了当的解决方案.

我正在使用sqlalchemy来查询postgres.如果发生客户端超时,我想从另一个线程停止/取消长时间运行的postgres查询.该线程可以访问Session或Connection对象.

此时我尝试过:

session.bind.raw_connection().close()
Run Code Online (Sandbox Code Playgroud)

session.connection().close()
Run Code Online (Sandbox Code Playgroud)

session.close
Run Code Online (Sandbox Code Playgroud)

session.transaction.close()
Run Code Online (Sandbox Code Playgroud)

但无论我尝试什么,postgres查询仍然会继续,直到它结束.我从顶部看pg就知道这一点.这不是很容易吗?我错过了什么?如果没有获得pid并直接发送停止信号,这是不可能的吗?

Cod*_*ngo 7

到目前为止,这似乎运作良好:

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()
Run Code Online (Sandbox Code Playgroud)

资源