psycopg2 - 插入多行更快的列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了psycopg2 - 插入多行更快的列相关的知识,希望对你有一定的参考价值。

我正在尝试在我的数据库中插入多行,目前我不知道同时插入所有行的方法或任何其他有助于节省时间的方法(顺序大约300行需要大约30秒)。

我的'行'是元组列表中的元组(转换为元组元组),例如[(col0, col1, col2), (col0, col1, col2), (.., .., ..), ..]

def commit(self, tuple):
    cursor = self.conn.cursor()
    for tup in tuple:
        try:
            sql = """insert into "SSENSE_Output" ("productID", "brand", "categoryID", "productName", "price", "sizeInfo", "SKU", "URL", "dateInserted", "dateUpdated")
              values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"""

            cursor.execute(sql, tup)
            self.conn.commit()
        except psycopg2.IntegrityError:
            self.conn.rollback()
            sql = 'insert into "SSENSE_Output" ' 
                  '("productID", "brand", "categoryID", "productName", "price", "sizeInfo", "SKU", "URL", "dateInserted", "dateUpdated")' 
                  'values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s) on conflict ("productID") do update set "dateUpdated" = EXCLUDED."dateUpdated"'
            cursor.execute(sql, tup)
            self.conn.commit()
        except Exception as e:
            print(e)

在for循环完成后我也尝试了提交,但仍然会产生相同的时间。有没有办法让这个插入速度明显加快?

答案

构建一个大的INSERT语句而不是其中许多将大大改善执行时间,你应该看看here。它适用于mysql,但我认为类似的方法适用于postgreSQL

另一答案

在postgres中,您可以使用以下格式:

INSERT INTO films (code, title, did, date_prod, kind) VALUES
('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');

由于您的记录基础异常处理,您可以在生成此查询之前首先解决重复项,因为发生完整性错误时整个查询可能会失败。

以上是关于psycopg2 - 插入多行更快的列的主要内容,如果未能解决你的问题,请参考以下文章

使用 psycopg2 copy_expert 从 postgreSQL 表中更快地读取数据

使用带有 Lambda 的 psycopg2 插入 Redshift (Python)

SQL求助,我要想在一张表新增多行,只有第一列值不同,后面的列值相同,该怎么插入?

psycopg2 无法插入特定列

Psycopg2 使用占位符插入表格

Psycopg2 在 postgres 数据库中插入 python 字典