从python数据框

时间:2016-09-19 19:51:23

标签: python sql postgresql bulkupdate

我使用下面的python代码根据value更新postgres数据库列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()

1 个答案:

答案 0 :(得分: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. 插入记录
  4. 只需使用查询UPDATE destination_table SET value = t.value FROM tmp_table t WHERE id = t.id或任何other preferred syntax

  5. 更新目标表