Поскольку 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
и используйте conn
object.
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()
.