0

我正在使用下面的 python 代码来更新value基于Id. 这个循环必须运行数千条记录,并且需要更长的时间。

有没有一种方法可以传递数据帧值数组而不是循环每一行?

 for i in range(0,len(df)):
        QUERY=""" UPDATE "Table" SET "value"='%s' WHERE "Table"."id"='%s'
            """ % (df['value'][i], df['id'][i])
        cur.execute(QUERY)
        conn.commit()
4

1 回答 1

0

取决于您用来与 PostgreSQL 通信的库,但通常通过COPY FROM命令进行批量插入要快得多。

如果您使用 psycopg2,则如下所示:

cursor.copy_from(io.StringIO(string_variable), "destination_table", columns=('id', 'value'))

其中string_variable是制表符和新行分隔的数据集,例如1\tvalue1\n2\tvalue2\n.

为了实现高性能的批量更新,我会这样做:

  1. 创建临时表:CREATE TEMPORARY TABLE tmp_table;;

  2. 使用copy_from插入记录;

  3. 只需使用查询UPDATE destination_table SET value = t.value FROM tmp_table t WHERE id = t.id或任何其他首选语法更新目标表

于 2016-09-19T22:37:55.860 回答