как закрыть панды read_sql соединение - PullRequest
1 голос
/ 28 октября 2019

Следующий код выдает ошибку, которая говорит, что база данных заблокирована:

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

, но если я делаю это наоборот:

    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 ) блокирует базу данных. Я нашел этот вопрос , но engine.dispose() не работал для меня. Как обойти эту проблему?

1 Ответ

0 голосов
/ 29 октября 2019

Поскольку chunksize создает генератор фреймов данных, и вы ничего не делаете с df_chunks, этот объект может по-прежнему содержать указатель на исходный объект engine, и, следовательно, "блокирует" базу данных. Чтобы разрешить вашу первую попытку, рассмотрите возможность выполнения итерации для df_chunks:

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 и используйте connobject.

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

Также при использовании with в качестве диспетчера контекста нет необходимости вызывать close: conn.close().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...