3

我正在从 Python 连接到雪花数据仓库,我遇到了一个奇怪的行为。如果我从 SnowFlake 检索的行数较少,Python 程序将成功退出,但如果我尝试检索超过 200K 行,则该程序会无限期地挂在那里。我 100% 确定我的机器没有问题,因为我能够从 Postgres 等其他类型的数据库系统检索 5 到 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 上遇到了同样的问题。有没有人遇到过类似的问题?

4

2 回答 2

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)
    ...

在 with .. 之后,引擎对象应该会自动关闭。

于 2019-09-01T04:16:31.370 回答
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的问题页面上获取它。

请注意,我自己尝试过,但到目前为止无法重现该问题。

于 2018-01-27T15:04:39.430 回答