我在PostgreSQL数据库表中存储了一个Google表格文件,并且每当对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)
但是,在将详细信息添加到以前仅具有日期的行之后,该行的ID将更改为最新的序列ID(即,如果工作表中有200行,则ID为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) """