Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django 1.10删除大型级联查询集_Python_Django_Django Models - Fatal编程技术网

Python Django 1.10删除大型级联查询集

Python Django 1.10删除大型级联查询集,python,django,django-models,Python,Django,Django Models,我正在尝试从大型查询集中删除所有对象。这是我的模特 from __future__ import unicode_literals from django.contrib.auth.models import User from django.db import models class Fund(models.Model): name = models.CharField(max_length=255, blank=False, null=False) start_dat

我正在尝试从大型查询集中删除所有对象。这是我的模特

from __future__ import unicode_literals
from django.contrib.auth.models import User
from django.db import models


class Fund(models.Model):

    name = models.CharField(max_length=255, blank=False, null=False)
    start_date = models.DateField(default=None, blank=False, null=False)

    def __unicode__(self):
        return self.name


class FundData(models.Model):

    fund = models.ForeignKey(Fund, on_delete=models.CASCADE)
    date = models.DateField(default=None, blank=False, null=False)
    value = models.FloatField(default=None, blank=True, null=True)

    def __unicode__(self):
        return "{} --- Data: {} --- Value: {} ".format(str(self.fund), str(self.date), str(self.value))
但是当我试图删除所有记录时,查询会花费太多时间,mysql会超时

Fund.objects.all().delete()
  • 在视图中管理此操作的最佳方法是什么
  • 有一种从终端调用django命令的方法吗

首先,您可以通过编辑
settings.py来更改MySQL的超时时间

DATABASES = {
    'default': {
        ...
        OPTIONS = {
            'connect_timeout': 5, # your timeout time
        }
        ...
    }
}
.delete()
速度较慢的原因有:

  • Django必须确保级联删除功能正确。它必须寻找模型的外键
  • Django必须以某种方式处理模型的保存前和保存后信号
  • 如果您确定您的模型没有级联删除或任何要处理的信号,您可以尝试使用private
    \u raw\u delete
    ,如下所示:

    queryset._raw_delete(queryset.db)
    

    您可以找到有关它的更多详细信息

    最后,我得到了一个简单的解决方案,删除所有级联对象,分解了宏删除操作,更喜欢逐个删除基金对象。因为这是一个非常长的操作(对于数千个对象,每个对象大约1秒),所以我将其分配给芹菜工人。缓慢但安全我认为,如果有人有更好的解决方案,请让我知道

    @shared_task
    def reset_funds():
        for fund in Fund.objects.all():
            print "Delete Fund: {}".format(fund.name)
            fund.delete()
        return "All Funds Deleted!"
    

    我的模型有on_delete=models.CASCADE。删除所有基金我还删除了所有相关的基金数据(每个基金数千)。“级联没有保护”的意思是什么?我不确定更改连接超时是否有帮助。来自mysql文档:“mysqld服务器在响应错误握手之前等待连接数据包的秒数。默认值为10秒。如果客户端经常遇到表单错误,则增加连接超时值可能会有所帮助。在'XXX'系统中,与mysql服务器断开连接。@Andrea我认为“级联没有保护”意味着它们不会被删除。你没有粘贴精确的回溯,所以很难说你有哪个超时。你不认为这会有帮助吗?好的,谢谢,我同意你的看法,我得到“锁定等待超时超过;尝试重新启动事务”,这可能是因为mysql进程之前在执行长删除操作时锁定了db,然后卡住了