我必须每小时在表中插入大量日志记录,我不会关心在此过程中发生的完整性错误或违规。
如果我禁用 autoCommit 并执行批量插入,则游标不会插入事务失败行以外的任何内容。有没有办法解决这个问题?
一种技巧是在应用程序级别处理此问题。我可以实现一个 n 大小的缓冲区并进行批量插入。如果该事务中的某些内容失败,则递归地为 buffer_first_half + buffer_second_half 重复插入
def insert(buffer):
try:
bulk_insert(buffer)
except:
connection.rollback()
marker = len(buffer)/2
insert(buffer[:marker])
insert(buffer[marker:])
Run Code Online (Sandbox Code Playgroud)
但我真的希望是否可以使用任何 Postgres 的内置功能来实现?
PostgreSQL 没有为此提供任何内置的东西。您可以使用SAVEPOINTs,但它们并不比单个事务好多少。
将每个插入视为一个单独的事务,并努力使这些事务更快:
SET synchronous_commit = off在你的会话中INSERT存入UNLOGGED表格,INSERT INTO ... SELECT检查后将结果存入真实表格这是一个早期的密切相关的答案,它也链接到更多信息。我没有将其标记为重复,因为另一个特定于类似更新插入的数据加载,您对更一般的错误处理感兴趣。