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并直接发送停止信号,这是不可能的吗?
到目前为止,这似乎运作良好:
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)
| 归档时间: |
|
| 查看次数: |
3505 次 |
| 最近记录: |