我正在使用python将一个批处理的csv文件加载到postgres(请参见表A)。 我正在使用熊猫将数据上传到块中,这非常快。
for chunk in pd.read_csv(csv_file, sep='|',chunksize=chunk_size,low_memory=False):
现在我想根据以下规则使用A更新另一个表(例如表B)
我可以使用下面的方法做到这一点,然后遍历每一行,但是表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]
答案 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 )