防止重复数据的最佳做法(pandas / postgres)

时间:2015-12-07 11:46:25

标签: postgresql pandas

我正在尝试防止基于三列将重复数据添加到数据库中。在熊猫中,这很简单,因为我可以drop_duplicates(subset = ['customer_id', 'call_time', 'employee_id'], inplace = True, keep = 'last']

我最近安装了postgresql,并使用to_sql使用SQLAlchemy加载数据。

从文件开头的数据库中读取,找到文件中存在的最大日期,然后只读取/修改在该日期之后发生的新数据是否合乎逻辑?假设文件中的最大日期是12/04,那么我将添加12/05向前(max_date + pd.Timedelta(days = 1))的文件,以确保我没有添加重复信息。

我当前的设置,因为我只使用.csv文件,所以要始终读取整个月(当前月份)的数据是安全的。然后我每天一遍又一遍地覆盖一个月初至今的csv文件,每次都添加一天的新数据。

start_date = (central_time - pd.Timedelta(days = 0))- pd.offsets.MonthBegin()
end_date = central_time
days = ((pd.Timestamp(end_date) - pd.Timestamp(start_date)) / np.timedelta64(1, 'D')).astype(int)

1 个答案:

答案 0 :(得分:2)

您可以将UNIQUE约束添加到您的列中,例如:

CREATE TABLE tab(id SERIAL PRIMARY KEY,
                 customer_id INT,
                 call_time TIMESTAMP,
                 employee_id INT,
                 note VARCHAR(100),
                 CONSTRAINT uc_tab UNIQUE (customer_id, call_time, employee_id)
            );

然后使用INSERT INTO ... ON CONFLICT syntax

  

可选的ON CONFLICT子句指定了替代操作   提出唯一违规或排除约束违规错误。   对于建议插入的每个单独行,要么插入   收益,或者,如果由仲裁者约束或指数指定   违反了conflict_target,采取了替代的conflict_action。   在冲突时不要简单地避免插入一行作为它   替代行动。 ON CONFLICT DO UPDATE更新现有行   与插入作为替代方案的行冲突   动作。

INSERT INTO tab(customer_id, call_time, employee_id, note)
VALUES (1, TO_TIMESTAMP('2015-12-01','YYYY-MM-DD'), 1, 'Note1');


INSERT INTO tab(customer_id, call_time, employee_id, note)
VALUES (1, TO_TIMESTAMP('2015-12-01','YYYY-MM-DD'), 1, 'Note2');
-- ERROR: duplicate key value violates unique constraint "uc_tab" Detail: 
-- Key (customer_id, call_time, employee_id)=(1, 2015-12-01 00:00:00, 1)
-- already exists.

INSERT INTO tab(customer_id, call_time, employee_id, note)
VALUES (1, TO_TIMESTAMP('2015-12-01','YYYY-MM-DD'), 1, 'Note2') 
ON CONFLICT ON CONSTRAINT uc_tab DO UPDATE SET note = EXCLUDED.note;