从另一个postgres表更新一个post格雷斯表



我正在使用python(比如表a(将一个批处理csv文件加载到postgres。我正在使用panda将数据上传到区块中,这相当快。

for chunk in pd.read_csv(csv_file, sep='|',chunksize=chunk_size,low_memory=False):

现在我想根据以下规则使用A更新另一个表(比如表B(

  • 如果表A中有任何新记录不在表B中,则将其作为新记录插入表B中(基于Id字段(
  • 如果表A中存在的相同ID的值发生变化,则使用表A更新表B中的记录(我需要根据表A更新一些服务器表(

我可以使用下面的代码来完成这项工作,然后循环遍历每一行,但表A的记录总是在1825172左右,而且速度变得非常慢。任何论坛成员都可以帮助加快这一进程,或者提出实现这一目标的替代方法。

cursor.execute(sql)
records = cursor.fetchall()
for row in records:  
id= 0 if row[0] is None else row[0]  # Use this to match with Table B and decide insert or update     
id2=0 if row[1] is None else row[1]   
id2=0 if row[2] is None else row[2]    

您可以利用Postgres upstart语法,如:

insert into tableB tb (id, col1, col2)
select ta.id, ta.col1, ta.col2 from tableA ta
on conflict(id) do update
set col1 = ta.col1, col2 = ta.col2

您应该完全在DBMS中执行此操作,而不是在python脚本中循环记录。这使您的DBMS能够更好地进行优化。

UPDATE TableB
SET    x=y
FROM TableA
WHERE TableA.id = TableB.id
INSERT INTO TableB(id,x)
SELECT id, y
FROM TableA
WHERE TableA.id NOT IN ( SELECT id FROM TableB )

最新更新