我从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相同的问题。有没有人遇到类似的问题?
答案 0 :(得分:0)
您可以从UI查看查询状态吗? “历史记录”页面应包含查询。如果仓库尚未就绪,则可能需要几分钟才能启动查询。 (我想这不太可能)。
尝试更改与此的连接:
connection = engine.connect()
results = connection.execute(query)
print (results.rowcount)
connection.close()
engine.dispose()
如果没有显式关闭连接,SQLAlchemy的dispose不会关闭连接。我之前询问过,但到目前为止,解决方法只是关闭连接。
最后,如果问题仍然存在,请将记录器添加到顶部:
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)
...
在使用..之后,引擎对象应自动关闭。