如何在执行psycopg2的copy\u之后释放postgres表上的锁

vhipe2zx  于 2021-07-29  发布在  Java
关注(0)|答案(0)|浏览(166)

我正在用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并终止它们?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题