从另一个postgres表更新一个postgres表

时间:2019-10-24 13:12:49

标签: sql python-3.x postgresql extract

我正在使用python将一个批处理的csv文件加载到postgres(请参见表A)。 我正在使用熊猫将数据上传到块中,这非常快。

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

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

  • 如果表A中有任何新记录,但表B中没有,则将其作为新记录插入表B中(基于ID字段)
  • 如果表A中的值更改为表B中存在的相同ID,则使用表A更新表B中的记录 (有些服务器表需要根据表A进行更新)

我可以使用下面的方法做到这一点,然后遍历每一行,但是表A总是有大约1,825,172的记录,并且变得非常慢。任何论坛成员都可以帮助加快这一步,或提出另一种方法来实现这一目标。

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]    

2 个答案:

答案 0 :(得分:1)

您可以利用Postgres upsert语法,例如:

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

答案 1 :(得分:0)

您应该在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 )