我正在编写一个连接到数据库并挂起多行的应用程序,它为每一行创建SAVEPOINT,因此如果出现错误,我可以回滚而不会破坏事务,并且每500行提交一次。
问题是它对于远程数据库连接(在DigitalOcean droplet上的postgresql数据库)工作速度非常慢 - 处理1000行需要大约35分钟,而本地数据库只有7秒(这也不是很快,但是没问题)。
我找到了关于使用一个cursor.execute()进行upserting的帖子,比如here,但是如果使用这个技巧我该如何捕获错误?或者我还应该做些什么才能让它更快地运作?这是我的代码:
self.connection = psycopg2.connect(self.connection_settings)
self.cursor = self.connection.cursor()
for record in dbf_file:
self.cursor.execute("SAVEPOINT savepoint;")
try:
self.send_record(record, where_to_save=database)
self.count += 1
self.batch_count += 1
if self.batch_count >= BATCH_COUNT_MAX:
self.connection.commit()
self.cursor.close()
self.cursor = self.connection.cursor()
self.batch_count = 0
except Exception:
self.cursor.execute("ROLLBACK TO SAVEPOINT savepoint;")
self.save_error(traceback.format_exc())
self.error_count += 1
self.batch_count += 1
if self.batch_count == BATCH_COUNT_MAX:
self.connection.commit()
self.cursor.close()
self.cursor = self.connection.cursor()
self.batch_count = 0
else:
if self.batch_count != 0:
答案 0 :(得分:0)
鉴于您已经在使用文件,我建议:
copy_from()
这样您就可以消除不必要的网络开销。