Python Flask:通过SQL Alchemy ORM + Pandas执行的查询超时

时间:2018-09-25 12:35:17

标签: python pandas flask sqlalchemy gunicorn

我正在使用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在何处起作用的详细信息。

0 个答案:

没有答案