如何在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_address'),ip_port=data.get('ip_port'),defaults=**data)
但
ProxyData.objects.update_or_create(defaults=default,**data)
意味着如果一个实例适合**data
然后更新它的ip和port。如果我猜对了,这正好与你想要的相反。
以上是关于如何在django中复制数据,我该如何避免?的主要内容,如果未能解决你的问题,请参考以下文章
如果字符串为空,如何避免 Tostring 异常? [复制]