首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何关闭pandas read_sql连接

如何关闭pandas read_sql连接
EN

Stack Overflow用户
提问于 2019-10-29 02:41:22
回答 1查看 3.8K关注 0票数 2

下面的代码产生一个错误,指出数据库已锁定:

代码语言:javascript
运行
复制
    df_chunks = pd.read_sql('cdr', engine, chunksize=100000)
    engine.dispose()
    with engine.connect() as conn:
        trans = conn.begin()
        query = """
        CREATE TABLE test (row_id BIGINT,ego_id BIGINT,alter_id BIGINT)
        """
        print(query)
        conn.execute(query)
        trans.commit()
        conn.close()

但如果我以相反的方式来做:

代码语言:javascript
运行
复制
    with engine.connect() as conn:
        trans = conn.begin()
        query = """
        CREATE TABLE test (row_id BIGINT,ego_id BIGINT,alter_id BIGINT)
        """
        print(query)
        conn.execute(query)
        trans.commit()
        conn.close()
    df_chunks = pd.read_sql('cdr', engine, chunksize=100000)

它可以工作,并且我能够生成新的表。因此,从这里看,问题似乎是pd.read_sql (请参阅docs)锁定了数据库。我找到了this question,但engine.dispose()不适合我。解决这个问题的方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2019-10-29 22:36:03

因为chunksize构建了一个数据帧生成器,而您从未对df_chunks做过任何操作,所以这个对象可能仍然持有指向源对象engine的指针,因此会“锁定”数据库。要解决第一次尝试,请考虑在df_chunks上运行迭代

代码语言:javascript
运行
复制
with engine.connect() as conn:
    trans = conn.begin()
    query = """CREATE TABLE test (row_id BIGINT,ego_id BIGINT,alter_id BIGINT)
            """
    print(query)
    conn.execute(query)
    trans.commit()

df_chunks = pd.read_sql('cdr', engine, chunksize=100000)

for df in df_chunks:
    # DO SOMETHING WITH EACH df

engine.dispose()                     # ALLOWED SINCE GENERATOR IS EXHAUSTED AFTER for LOOP

或者,为了解决第二次尝试,可以将read_sql调用集成到with块中并使用conn对象。

代码语言:javascript
运行
复制
with engine.connect() as conn:
    trans = conn.begin()
    query = """CREATE TABLE test (row_id BIGINT,ego_id BIGINT,alter_id BIGINT)
            """
    print(query)
    conn.execute(query)
    trans.commit()

    # INDENT LINE AND USE conn OBJECT
    df_chunks = pd.read_sql('cdr', conn, chunksize=100000)

    for df in df_chunks:
        # DO SOMETHING WITH EACH df

engine.dispose()                     # CLOSE engine OBJECT NOT conn

此外,当使用close作为上下文管理器时,不需要调用withconn.close()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58596652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档