У меня есть файл листов 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) """