2017-06-27 26 views
3

我正在查找刪除4個數據庫中存在的一些相同的行。 每個數據庫都有一個名爲Identity_Individu的表。不要擔心這個過程,這是爲了在數據庫之間共享數據而發現的唯一方法,因爲Django不允許使用數據交叉關係。在許多MySQL表中刪除相同的行

我有這樣的一部分:

​​

我發現了一個問題:

(1093,「表 'Identity_individu' 被指定了兩次,既作爲目標 爲 '刪除'並作爲數據的單獨源「)

我怎麼也得爲了DELET使用.delete()using() e關於每個表中的條件的所有行?

我試圖.delete(using=element)但我得到:

刪除()得到了一個意想不到的關鍵字參數 '使用'

+0

我不知道

  • .using()應該被使用,但首先使用它有什麼不同?個人對象使用(元素).filter(pk = query_number_list).delete() – Thom

  • +0

    @Thom Nope,我仍然得到同樣的問題:'(1093,「表'Identity_individu'被指定兩次,兩者都作爲' DELETE'並作爲數據的單獨源代碼「)':/所有django文檔都說:'.delete(using = ...)'但它似乎不起作用 – Deadpool

    +0

    我在我身邊試過了,它工作正常問題在於.using()的位置),似乎對mysql有約束。也許嘗試用Django Debug Toolbar查看執行的SQL查詢。 – Thom

    回答

    2

    試圖通過迫使查詢集的評估,而不是使用使用list子查詢來修改你的要求這裏是我們的解決方案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')) 
    

    在兩個importants件事:

    • 第一查詢集query_number_list結果應該按順序保存在list稍後使用前.delete()
    1

    這是一個MySQL的限制,請參見this answer

    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')) 
    
    +0

    我試了你的答案,我得到:'int()參數必須是一個字符串或數字,而不是'list''。它不應該是一個列表,因爲我正在遍歷每個數據庫以刪除該行。 – Deadpool

    +0

    您是否按照我的建議嘗試過pk__in而不是pk?再看一下你的代碼,你可以使用'first()':我會更新我的答案。 –

    +0

    是的,我試過並始終使用相同的issu:'(1093,「表'Identity_individu'被指定了兩次,既作爲'DELETE'的目標,也作爲數據的獨立源」)' – Deadpool