Postgres ON CONFLICT DO UPDATE только ненулевые значения в python - PullRequest
1 голос
/ 29 апреля 2020

У меня есть таблица, для которой при обработке записей я получаю либо полную запись, либо только обновляемые столбцы.

Я хочу написать запрос для обработки обновлений, но обновлять только столбцы с ненулевыми значениями. Например,

Существующая таблица:

1 | John Doe | USA
2 | Jane Doe | UK

Поступающие записи:

(3, Kate Bill, Canada)
(2, null, USA)

Я хочу вставить первую запись и при конфликте ключей при обновлении ТОЛЬКО второй записи последний столбец.

Я не уверен, как написать это с помощью вызова метода execute_values:

execute_values(cursor, "INSERT INTO user_data\
           (id, name, country) VALUES %s ON CONFLICT DO UPDATE SET \
            <how to only set non null values here>", vendor_records)

Я использую psycopg2 для выполнения этого.

1 Ответ

2 голосов
/ 30 апреля 2020

В конфликте on (обратите особое внимание на do update set name = expression ), вы можете использовать объединение с исключенными значениями для обновления столбцов до указанные значения (если не ноль) или существующие значения (если указано ноль); Это будет, что формат:

-- setup  
 create table test1(id  integer primary key, col1 text,col2 text); 
 insert into test1(id, col1, col2)
    values (1, 'John Doe', 'USA')
         , (2, 'Jane Doe', 'UK');
 select * from test1; 

 -- test on conflict
 insert into test1 as t(id, col1, col2)     
      values (3, 'Kate Bill', 'Canada')
           , (2, null, 'USA')
    on conflict(id) do update   
       set col1 = coalesce(excluded.col1,  t.col1)
         , col2 = coalesce(excluded.col2,  t.col2);

-- validate
 select * from test1;     
...