【问题标题】:Delete identical row in many MySQL tables删除许多 MySQL 表中的相同行
【发布时间】:2017-11-30 06:45:44
【问题描述】:

我正在寻找删除 4 个数据库中存在的一些相同行。 每个数据库都有一个名为Identity_Individu 的表。不用担心这个过程,这是在数据库之间共享数据的唯一方法,因为 Django 不允许使用数据交叉关系。

我有这部分:

#settings.py file
BDD = ('default', 'DS_Douane', 'DS_Impots', 'DS_Finance')

#views.py file

@login_required
def Identity_Deleting(request) :

    query_number = request.GET.get('q6')

    if query_number :
        query_number_list = Individu.objects.filter(NumeroIdentification__iexact=query_number)    
    else :
        query_number_list = Individu.objects.none()

    form = IndividuFormulaire(request.POST or None, instance = query_number_list.first())

    if "Delete" in request.POST :
        for element in settings.BDD :
            form = Individu.objects.filter(pk=query_number_list).delete().using(element)

        return HttpResponseRedirect(reverse('Home'))

我遇到了一个问题:

(1093, "表'Identity_individu'被指定了两次,都作为目标 用于“删除”并作为单独的数据源”)

我必须如何使用 .delete()using() 才能删除每个表中符合条件的所有行?

我试过.delete(using=element),但我得到了:

delete() 得到了一个意外的关键字参数 'using'

【问题讨论】:

  • 我不确定,但首先使用 using 有什么不同吗? Individu.objects.using(element).filter(pk=query_number_list).delete()
  • @Thom 不,我仍然遇到同样的问题:(1093, "Table 'Identity_individu' is specified twice, both as a target for 'DELETE' and as a separate source for data"):/ 所有 django 文档都说:.delete(using=...) 但它似乎不起作用
  • 我在我这边试过了,它可以工作(无论 .using() 放在哪里),似乎对 mysql 有限制。也许尝试使用 Django 调试工具栏查看执行了什么 SQL 查询。
  • 我有不同的数据库^^你有没有同时尝试不同的数据库?
  • 是的,我尝试使用 2 个 SQLite DB :)

标签: django


【解决方案1】:

这是我们talked之后的解决方案:)

@login_required
def Identity_Deleting(request) :

    query_number = request.GET.get('q6')

    if query_number :
        query_number_list = Individu.objects.filter(NumeroIdentification__iexact=query_number)    
    else :
        query_number_list = Individu.objects.none()

    instance = query_number_list.first()
    form = IndividuFormulaire(request.POST or None, instance = query_number_list.first())

    if "Delete" in request.POST :
        ids_to_delete = list(query_number_list.values_list('id', flat=True))
        for element in settings.BDD :
            form = Individu.objects.using(element).filter(pk__in=ids_to_delete).delete() 

        return HttpResponseRedirect(reverse('Home'))

有两个重要的事情:

  • 第一个查询集query_number_list 结果应保存在list 中以便以后使用
  • .using() 应该在.delete() 之前使用

【讨论】:

    【解决方案2】:

    这是一个mysql限制,见this answer

    尝试通过强制评估查询集而不是使用 list 的子查询来修改您的请求:

     Individu.objects.filter(pk__in=list(query_number_list.values_list('id', flat=True))).delete().using(element)
    

    或者如果总是只有 1 个Individu,你可能想要这样的东西:

    @login_required
    def Identity_Deleting(request) :
    
        query_number = request.GET.get('q6')
    
        if query_number :
            individu = Individu.objects.filter(NumeroIdentification__iexact=query_number).first()
        else :
            individu = None
    
        form = IndividuFormulaire(request.POST or None, instance = individu)
    
        if "Delete" in request.POST:
            if individu is not None:
                for element in settings.BDD :
                    Individu.objects.filter(pk=individu.pk).delete().using(element)
    
            return HttpResponseRedirect(reverse('Home'))
    

    【讨论】:

    • 我试过你的答案,我得到了:int() argument must be a string or a number, not 'list'。它不应该是一个列表,因为我正在遍历每个数据库以删除该行。
    • 您是否按照我的建议尝试过 pk__in 而不是 pk ?再次查看您的代码,您可以使用first():我会更新我的答案。
    • 是的,我尝试过并且总是相同的问题:(1093, "Table 'Identity_individu' is specified twice, both as a target for 'DELETE' and as a separate source for data")
    • 您的答案已在默认数据库中删除 individu,但在其他数据库中未删除。我必须看看为什么;)
    • 他们在所有数据库中都有相同的 pk 吗?或者您可能想根据 NumeroIdentification 删除基础... Bonne chance ;)
    猜你喜欢
    • 1970-01-01
    • 2020-02-20
    • 2019-01-06
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多