从 python 数据框批量更新 Postgres 列
Bulk update Postgres column from python dataframe
我正在使用下面的 python 代码更新基于 Id
的 postgres 数据库列 value
。对于数千条记录,此循环必须 运行,并且需要更长的时间。
有没有一种方法可以传递数据帧值数组而不是循环每一行?
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()
取决于您用来与 PostgreSQL 通信的库,但通常通过 COPY FROM 命令进行批量插入要快得多。
如果你使用 psycopg2,它就像下面这样简单:
cursor.copy_from(io.StringIO(string_variable), "destination_table", columns=('id', 'value'))
其中 string_variable 是制表符和新行分隔的数据集,如 1\tvalue1\n2\tvalue2\n
.
为了实现高效的批量更新,我会这样做:
创建临时 table: 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
更新目标 table
我正在使用下面的 python 代码更新基于 Id
的 postgres 数据库列 value
。对于数千条记录,此循环必须 运行,并且需要更长的时间。
有没有一种方法可以传递数据帧值数组而不是循环每一行?
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()
取决于您用来与 PostgreSQL 通信的库,但通常通过 COPY FROM 命令进行批量插入要快得多。
如果你使用 psycopg2,它就像下面这样简单:
cursor.copy_from(io.StringIO(string_variable), "destination_table", columns=('id', 'value'))
其中 string_variable 是制表符和新行分隔的数据集,如 1\tvalue1\n2\tvalue2\n
.
为了实现高效的批量更新,我会这样做:
创建临时 table:
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 更新目标 table