Функция UPSERT в PostgreSQL - PullRequest
       12

Функция UPSERT в PostgreSQL

0 голосов
/ 19 октября 2018

У меня есть файл листов Google, хранящийся в таблице базы данных PostgreSQL, и мне нужно обновлять эту таблицу каждый раз, когда вносятся изменения в лист Google.Каждый день запускается скрипт, который генерирует список словарей для каждой строки на листе следующим образом:

content = [{'Date': 01-01-2018, 'Day_Name': 'Monday', 'Message': NULL, 'More_Info': 'this is more info'},
           {'Date': 02-01-2018, 'Day_Name': NULL, 'Message': NULL, 'More_Info': NULL},
           {'Date': 03-01-2018, 'Day_Name': NULL, 'Message': NULL, 'More_Info': NULL},
           {'Date': 04-01-2018, 'Day_Name': NULL, 'Message': NULL, 'More_Info': NULL},
           ......
           {'Date': 10-09-2018, 'Day_Name': 'Tuesday', 'Message': 'Hello', 'More_Info': NULL}]

Я написал приведенный ниже запрос UPSERT, который достигает того, что я хочу:

cur.executemany(""" 
      INSERT INTO table
      (hol_date, day_name, message, more_info)
      VALUES 
      (to_date(%(Date)s, 'DD/MM/YYYY'), %(Day_Name)s, %(Message)s, %(More_info)s)

      ON CONFLICT ON CONSTRAINT holiday_date_and_day_name
      DO UPDATE SET
      message = %(Message)s, 
      more_info = %(More_info)s 
      """, content)

Однако после добавления сведений в строку, в которой ранее была только дата, идентификатор этой строки изменится на последний серийный идентификатор (т. Е. Если на листе 200 строк, строка с идентификатором 2 изменится на201 после добавления Day_name)

Моя таблица создается следующим образом:

cur.execute(""" CREATE TABLE table (
            hol_id BIGSERIAL PRIMARY KEY,
            hol_date DATE NOT NULL,
            day_name CHARACTER VARYING (250),
            message TEXT,
            more_info TEXT """

cur.execute(""" ALTER TABLE public_holidays ADD CONSTRAINT holiday_date_and_day UNIQUE (hol_date, day_name) """
...