我正在使用pd.read_sql_query(sql=sql, con=conn)
方法通过Pandas通过SQL Alchemy运行查询。
我的查询是有效的sql,我的连接可以是与任何数据库(Postgres,Mysql,MS Sql,Oracle等)的连接
有时此查询要花费很多时间(以分钟为单位),我想将此特定查询的超时设置为仅5秒。
我从sqla的引擎中检索conn对象,该对象是使用sqla的create_engine
方法启动的。该代码的简化版本如下所示:
engine = self.database.get_sqla_engine() # this method has a call to create_engine
conn = engine.connect()
到目前为止,我已经尝试使用conn.execute('SET statement_timeout="5s"')
,但这仅适用于postgres 。
我还尝试过这样创建Timer thread:
t = threading.Timer(5, conn.connection.cancel)
t.start
我后来发现是这样的:
try:
df = pd.read_sql_query(sql=sql, con=conn)
return [row[0] for row in df.to_records(index=False)]
except DBAPIError, e:
if type(e.orig) == QueryCanceledError:
logging.info('Long running query was cancelled.')
return []
上述解决方案的问题是,仅当我在调试模式下运行flask应用程序时,它才有效。在生产模式下(使用gunicorn),计时器线程不调用cancel方法。 (我的猜测是因为程序已经在等待来自sqla的查询结果)
欢迎任何解决方案。
编辑:添加了有关如何创建连接对象以及sqla在何处起作用的详细信息。