Sqlalchemy Snowflake не закрывает соединение после успешного получения результатов
Я подключаюсь к хранилищу данных снежинок из Python, и у меня странное поведение. Программа Python успешно завершается, если я получаю меньшее количество строк из SnowFlake, но зависает там, если я пытаюсь получить более 200К строк. Я на 100% уверен, что с моей машиной проблем нет, потому что я могу извлечь от 5 до 10 миллионов строк из систем баз данных другого типа, таких как Postgres.
Моя среда Python - это Python 3.6, и я использую следующую версию библиотек -> SQLAlchemy 1.1.13, снежинка-соединитель-питон 1.4.13, снежинка-sqlalchemy 1.0.7,
Следующий код печатает общее количество строк и закрывает соединение.
from sqlalchemy import create_engine
from snowflake.sqlalchemy import URL
engine = create_engine(URL(
account=xxxx,
user=xxxxx,
password=xxxxx,
database=xxxxx,
schema=xxxxxx,
warehouse=xxxxx))
query = """SELECT * FROM db_name.schema_name.table_name LIMIT 1000"""
results = engine.execute(query)
print (results.rowcount)
engine.dispose()
Следующий код печатает общее количество строк, но соединение не закрывается, оно просто висит там, пока я вручную не убью процесс Python.
from sqlalchemy import create_engine
from snowflake.sqlalchemy import URL
engine = create_engine(URL(
account=xxxx,
user=xxxxx,
password=xxxxx,
database=xxxxx,
schema=xxxxxx,
warehouse=xxxxx))
query = """SELECT * FROM db_name.schema_name.table_name LIMIT 500000"""
results = engine.execute(query)
print (results.rowcount)
engine.dispose()
Я пробовал несколько разных таблиц, и я столкнулся с той же проблемой со SnowFlake. Кто-нибудь сталкивался с подобными проблемами?
1 ответ
Вы пытались вместо этого использовать оператор with, чтобы установить соединение
вместо этого:
engine = create_engine(URL(account=xxxx,user=xxxxx,password=xxxxx,database=xxxxx,schema=xxxxxx,warehouse=xxxxx))
results = engine.execute(query)
сделать следующее:
with create_engine(URL(account=xxxx,user=xxxxx,password=xxxxx,database=xxxxx,schema=xxxxxx,warehouse=xxxxx)) as engine:
# do work
results = engine.execute(query)
...
После с.. объект двигателя должен быть автоматически закрыт.
Можете ли вы проверить статус запроса из пользовательского интерфейса? Страница "История" должна содержать запрос. Если склад не готов, запуск запроса может занять несколько минут. (Думаю, это очень маловероятно).
Попробуйте изменить соединение на это:
connection = engine.connect()
results = connection.execute(query)
print (results.rowcount)
connection.close()
engine.dispose()
Распоряжение SQLAlchemy не закрывает соединение, если соединение явно не закрыто. Я спрашивал раньше, но пока что обходной путь - просто закрыть соединение.
Наконец, если проблема все еще сохраняется, добавьте регистратор в начало:
import logging
for logger_name in ['snowflake','botocore']:
logger = logging.getLogger(logger_name)
logger.setLevel(logging.DEBUG)
ch = logging.FileHandler('log')
ch.setLevel(logging.DEBUG)
ch.setFormatter(logging.Formatter('%(asctime)s - %(threadName)s %(filename)s:%(lineno)d - %(funcName)s() - %(levelname)s - %(message)s'))
logger.addHandler(ch)
и собрать журнал.
Если вывод слишком длинный, чтобы поместиться здесь, я могу взять его на странице вопроса по адресу https://github.com/snowflakedb/snowflake-sqlalchemy.
Заметьте, я пробовал сам, но пока не могу воспроизвести проблему.