我正在尝试防止基于三列将重复数据添加到数据库中。在熊猫中,这很简单,因为我可以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)
答案 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;