成功检索结果后,Sqlalchemy Snowflake没有关闭连接

时间:2018-01-26 15:24:41

标签: python-3.x sqlalchemy snowflake-datawarehouse

我从Python连接到snowflake datawarehouse,我遇到了一个奇怪的行为。如果我从SnowFlake检索更少的行但是在那里挂起 - 如果我尝试检索超过200K行,那么Python程序会成功退出。我100%确定我的机器没有问题,因为我能够从其他类型的数据库系统(如Postgres)中检索500到1000万行。

我的Python环境是Python 3.6,我使用以下版本的库 - > SQLAlchemy 1.1.13,snowflake-connector-python 1.4.13,snowflake-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相同的问题。有没有人遇到类似的问题?

2 个答案:

答案 0 :(得分:0)

您可以从UI查看查询状态吗? “历史记录”页面应包含查询。如果仓库尚未就绪,则可能需要几分钟才能启动查询。 (我想这不太可能)。

尝试更改与此的连接:

connection = engine.connect()
results = connection.execute(query)
print (results.rowcount)
connection.close()
engine.dispose()

如果没有显式关闭连接,SQLAlchemy的dispose不会关闭连接。我之前询问过,但到目前为止,解决方法只是关闭连接。

https://groups.google.com/forum/#!searchin/sqlalchemy/shige%7Csort:date/sqlalchemy/M7IIJkrlv0Q/HGaQLBFGAQAJ

最后,如果问题仍然存在,请将记录器添加到顶部:

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的问题页面上查看。

注意我自己试了但是到目前为止无法重现这个问题。

答案 1 :(得分:0)

您是否尝试过使用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)
    ...

在使用..之后,引擎对象应自动关闭。