我正在填充一个 PostgreSQL 表,其中包含之前从另一个数据库中选择的 ~11.000.000 行。我正在使用 Python 和 psycopg2。整个过程估计需要 1.5 小时才能完成。但是,大约 30 分钟后,我得到“连接意外关闭”异常。源代码如下所示:
incursor = indb.cursor()
incursor.execute("SELECT ...")
indb.commit() # (1) close transaction
outcursor = outdb.cursor()
rows = 0
for (col1, col2, col3) in incursor: # incursor contains ~11.000.000 rows
outcursor.execute("INSERT ...", (col1, col2, col3)) # This fails after ~30 minutes
row += 1
if row % 100 == 0: # (2) Write data every 100 rows
outcursor.close()
outdb.commit()
outcursor = outdb.cursor()
incursor.close()
outcursor.close()
outdb.commit()
我插入(1)
并(2)
在第一次尝试失败后,假设打开的事务的时间上限约为 30 分钟,或者游标具有挂起插入的上限。似乎这些假设都不是真的,错误在于其他地方。
这两个数据库都存储在我通过主机端口转发连接的 VirtualBox 机器上。我在主机上运行程序。
这两个数据库都只是用于测试目的,它们没有其他连接需要管理。也许我必须重写这个问题来解决这个问题,但是我需要在其他地方进行非常耗时的插入(大约运行几天),所以我非常担心psycopg2
PostgreSQL 中的一些隐藏的时间限制。