我在 PostgreSQL 中有一个临时表,并使用一个简单的
INSERT INTO ... SELECT ...
查询将数据从临时表复制到最终表。但是,我偶尔会遇到操作完成后数据丢失的问题。我不知道为什么会发生这种情况。我已经检查了暂存表的正确性(数据正确)
以下是一些值得注意的细节:
我正在使用的代码
import pg8000
...
bigSql = f"INSERT INTO final_tbl({sqlCols}) SELECT {sqlCols} FROM staging_tbl"
print(' ->Inserting data...')
limit = 4000000
offset = 0
while True:
cursor.execute(bigSql+f" LIMIT {limit} OFFSET {offset}")
print('Inserted ', cursor.rowcount)
if cursor.rowcount==0:
break
offset += limit
connection.commit()
关于服务器信息,我正在使用azure vm和laravel forge面板提供的postgressql。
使用这种方法,至少,您需要一个
ORDER BY
子句 - 否则,不同的查询调用不能保证以相同的顺序返回结果,并且您的 LIMIT … OFFSET …
可能会选择一些重复的行并错过其他行完全。
如果您有并发写入流量,您还需要处理它。
此外,如果您在没有具体原因的情况下决定采用此
LIMIT
解决方案,请考虑仅使用一个没有 LIMIT
或 OFFSET
的查询。在一个事务中进行大量插入不一定需要担心 - 例如,它不会阻止对表的并发读取或写入。