PostgreSQL中的UPSERT函数

时间:2018-10-19 15:45:42

标签: python postgresql upsert

我在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) """

0 个答案:

没有答案