Я выполняю запрос через SQL Alchemy через Pandas, используя метод pd.read_sql_query(sql=sql, con=conn)
.
Мой запрос является действительным sql, и мое соединение может быть соединением с любой базой данных (Postgres, Mysql, MS Sql, Oracle и т. Д.)
Иногда этот запрос занимает много времени (напорядка минут), и я хотел бы установить тайм-аут для этого конкретного запроса только на 5 секунд.
Я получаю объект conn из движка sqla, который инициируется с помощью метода create_engine
sqla.упрощенная версия этого кода выглядит следующим образом:
engine = self.database.get_sqla_engine() # this method has a call to create_engine
conn = engine.connect()
До сих пор я пытался использовать conn.execute('SET statement_timeout="5s"')
, но это работает только для postgres .
Я также пытался создать Поток таймера следующим образом:
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 []
Проблема с вышеРешение в том, что оно работает только тогда, когда я запускаю приложение фляги в режиме отладки.В производственном режиме (с использованием gunicorn) поток таймера не вызывает метод отмены.(Я предполагаю, потому что программа уже ждет этого запроса от sqla)
Любые решения приветствуются.
РЕДАКТИРОВАТЬ: Добавлены сведения о том, как создается объект подключения и где вступает в силу sqla.