我正在用python构建etl管道,将数据从s3加载到postgres数据库。因为有数以百万计的记录,我必须读取数据由雅典娜在块和使用一个interator加载到数据库中的数据。Pandas的 to_sql
太慢了,所以我在用 copy_from
将数据从缓冲区复制到表。但是在复制之后,表得到了锁。锁的数量取决于读取的块数。之后的下一步是截断该表。但是,由于表上有锁,因此不能截断它。如果只有一个块,那么在加载之后锁有时会被释放。从db断开连接似乎也无助于释放锁。
conn = psycopg2.connect(database=DBNAME, user=USER, host=HOST, password=DB_PASS)
for data_df in list(data_iter):
sio = StringIO()
sio.write(data_df.to_csv(index=None, header=None, quoting=csv.QUOTE_NONE, escapechar='\\', sep='|'))
sio.seek(0)
try:
with conn.cursor() as c:
c.copy_from(sio, 'cost_settlements_stg', columns=data_df.columns, sep='|')
conn.commit()
except Exception as e:
conn.close()
raise e
conn.close()
为什么装载后锁没有松开?我是否必须显式地找到锁的PID并终止它们?
暂无答案!
目前还没有任何答案,快来回答吧!