我的Flask应用读取附有新条目的观测值的基于时间的CSV日志文件。我旨在避免重复的方法是收集变量并在添加记录之前进行测试,如下所示:
sl = db.session.query(DesignObservation).filter_by(worker_id = worker_id).filter_by(design_id = design_id).filter_by(ob_date = ob_date)
if len(sl.all()):
pass
else:
db.session.add(observation_record)
db.session.commit()
不确定为什么此模式不添加记录。如果我放弃测试,记录会增加,但后续的运行会增加重复。
答案 0 :(得分:1)
您应该在要写入的表上设置UNIQUE约束。然后,数据库引擎将为您管理唯一性。
您将不得不处理即将出现的“唯一性约束失败”异常...
答案 1 :(得分:0)
我最终要做的是用ob_date解析design_id以确定唯一性,然后使用下面的函数进行检查以返回要添加的记录是否唯一的布尔值。
import parser.parse as date_parse
def check_4_obs_dups(design_id, ob_date):
# returns bool
r = DesignObservation.query.filter_by(design_id=design_id).all()
# convert date strings stored in SQLite to datetime
s = [date_parse(x.ob_date) for x in r]
return date_parse(ob_date) in s
然后,当遍历CSV文件的每一行时,我使用此循环检查唯一性:
if not check_4_obs_dups(design_id, ob_date):
db.session.add(observation_record