Mysql django中的重复数据是如何产生的,我如何避免它?

Mysql django中的重复数据是如何产生的,我如何避免它?,mysql,django,django-models,thread-safety,Mysql,Django,Django Models,Thread Safety,我正在做django的一个项目,只是一个人的项目 我用芹菜尝试django的项目,并在芹菜中添加了两个任务 一个任务,是关于一个爬行器通过请求写入,获取一些代理ip信息并通过django orm保存到mysql,这是update_或_create(默认值={'ip':'','port':'},***{'key':'value'})。我保持这个任务将始终由一个工作者通过redis lock控制数据。例如,一个工作运行该任务,redis lock get和其他尝试获取锁的工作失败,无法控制数据 另一

我正在做django的一个项目,只是一个人的项目

我用芹菜尝试django的项目,并在芹菜中添加了两个任务

一个任务,是关于一个爬行器通过请求写入,获取一些代理ip信息并通过django orm保存到mysql,这是update_或_create(默认值={'ip':'','port':'},***{'key':'value'})。我保持这个任务将始终由一个工作者通过redis lock控制数据。例如,一个工作运行该任务,redis lock get和其他尝试获取锁的工作失败,无法控制数据

另一个任务是spider,由tornado编写,用于检查代理ip数据。此外,将由一名工人通过redis lock运行。龙卷风中的蜘蛛也是单线

这两个任务可以同时运行

问题来了! 当我在几小时后运行这个项目时。我发现mysql中的一些数据是相同的。ip、端口和其他一些是相同的

当运行更新_或_create()的代码时,会出现错误:

get()返回2。 数据是怎么来的?在我看来,虽然最多两个线程会同时运行,但一个是use updatea_或_create,另一个是use.save()。任务use save()不会产生数据重复?而update_或_create()会通过get()检查数据,这意味着没有数据,也就是说数据库中没有像这个ip和端口这样的数据,但是,它有


谁能给我解释一下原因吗?

如果决定是否创建新实例的只有
ip
port
,那么应该是:

ProxyData.objects.update_or_create(
    ip_address=data.get('ip_a‌​ddress'),
    ip_port=dat‌​a.get('ip_port'),
    def‌​aults=**data,
)
但是


意味着只有当实例字段与
**数据
匹配时,
ip
端口
值才会更新。因此,如果
数据
不匹配,将插入一个新条目,其中包含
默认值
,可能会导致重复数据。如果我猜对了,这与你想要的正好相反。

任务
需要代码谢谢你的回答。我正在将代码上传到github,文件为:comm_tools..py所有代码都在project中。尝试获取
ProxyData
动态,移动
data\u need=ProxyData.objects.all()
对于ProxyData.objects.all()中的每个数据,在
put\u ip\u infor
方法中使用
我正在尝试您所说的,结果可能需要30或60分钟。如果我将
data\u need=ProxyData.objects.all(0
放入
put\u ip\u infor
中,就像
放入ProxyData.objects.all()中的每个数据一样
,有什么不同?在我看来,我没有什么不同,我的意思是,我不知道为什么要这样做?我认为错误的原因来自蜘蛛的代理ip部分,而不是检查部分?到目前为止,我已经得到了一些重复的数据。数据显示它是在不同的时间创建的,在两个任务中(获取ip数据并保存到mysql)头部和下方。其中一个没有检查。
ProxyData.objects.update_or_create(defaults=default, **data)