我使用下面的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()
答案 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
。
为了实现高效的批量更新,我会这样做:
创建临时表:CREATE TEMPORARY TABLE tmp_table;
;
使用 copy_from ;
只需使用查询UPDATE destination_table SET value = t.value FROM tmp_table t WHERE id = t.id
或任何other preferred syntax