下面的代码产生一个错误,指出数据库已锁定:
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)锁定了数据库。我找到了this question,但engine.dispose()
不适合我。解决这个问题的方法是什么?
发布于 2019-10-29 22:36:03
因为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
对象。
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作为上下文管理器时,不需要调用with
:conn.close()
。
https://stackoverflow.com/questions/58596652
复制相似问题