Python Flask: время ожидания запроса, выполняемого с помощью SQL Alchemy ORM + Pandas - PullRequest
0 голосов
/ 25 сентября 2018

Я выполняю запрос через 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...