如何在django中复制数据,我该如何避免?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在django中复制数据,我该如何避免?相关的知识,希望对你有一定的参考价值。

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

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

一个任务,是关于蜘蛛按请求写的,获取一些代理ip信息并通过django orm保存到mysql,这是update_or_create(defaults = {'ip':'','port':''},** {' key':'value'})。我保持这个任务总是由一个工人通过redis lock控制数据。比如,一个工作运行任务,redis lock get,另一个工作尝试锁定失败并且不会控制数据。

另一个任务,是一个蜘蛛,由龙卷风写,用于检查代理IP数据。此外,由一名工人通过redis锁运行。龙卷风的蜘蛛也是一个单一的线索。

这两个任务可能同时运行。

问题来了!

当我几个小时后运行项目时,大约几个小时后。我发现mysql中的一些数据是相同的。 ip,端口和其他一些是相同的。

当代码运行到update_or_create()时出现错误:

get() return 2.

数据如何来?在我的想法中,虽然最多两个线程会一起运行,但一个是使用updata_or_create,一个是使用.save()。任务使用save()不会重生数据?而update_or_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)

ProxyData.objects.update_or_create(defaults=default,**data) 

意味着如果一个实例适合**data然后更新它的ip和port。如果我猜对了,这正好与你想要的相反。

以上是关于如何在django中复制数据,我该如何避免?的主要内容,如果未能解决你的问题,请参考以下文章

如果字符串为空,如何避免 Tostring 异常? [复制]

如何避免 Django 中的导入时数据库访问?

Django 编辑表单数据:数据被复制而不是被更新

如何复制virtualenv

actionscheduler 表数据快速增加,我该如何解决? [关闭]

如果先前在 vue js html 中选择了这些选项,我该如何避免这些选项?