Обновление одной таблицы postgres из другой таблицы postgres - PullRequest
1 голос
/ 24 октября 2019

Я загружаю пакетный CSV-файл в Postgres, используя Python (скажем, таблица A). Я использую pandas для загрузки данных в чанк, что довольно быстро.

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

Теперь я хочу обновить другую таблицу (скажем, таблицу B), используя A на основе следующих правил

  • если в таблице A есть какие-либо новые записи, которых нет в таблице B, вставьте их как новую запись в таблицу B (на основе поля Id)
  • , если значения в таблице A для того же идентификатора изменятсякоторый существует в таблице B, затем обновите записи в таблице B, используя TableA (есть серверные таблицы, которые мне нужно обновить на основе таблицы 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 ]

1 голос
/ 24 октября 2019

Вы можете использовать синтаксис 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
0 голосов
/ 24 октября 2019

Вы должны делать это полностью внутри СУБД, а не перебирать записи внутри вашего скрипта Python. Это позволяет вашей СУБД лучше оптимизировать.

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 )
...