使用psycopg2和错误记录在PostgreSQL中多个行

时间:2017-08-05 15:25:02

标签: python postgresql performance psycopg2

我正在编写一个连接到数据库并挂起多行的应用程序,它为每一行创建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:

1 个答案:

答案 0 :(得分:0)

鉴于您已经在使用文件,我建议:

  1. 将这些文件设为CSV(500或每行有什么行)
  2. 将它们上传到服务器(scp / ftp / rsync)
  3. 使用psycopg' s copy_from()
  4. 这样您就可以消除不必要的网络开销。