wie finde ich FOREIGN KEYs?

Django, Flask, Bottle, WSGI, CGI…
Antworten
Pitwheazle
User
Beiträge: 1050
Registriert: Sonntag 19. September 2021, 09:40

In meinem Rechentrainer habe ich die Accounts mit einer OneToOne Beziehung mit einem "Profil" verknüpft und dieses mit wiederum mit anderen Tabellen.
Einige Schülerinnen und Schüler haben zwar einen Account, haben es aber irgendwie geschafft, ihre Anmeldung abzubrechen, ohne ein Profil anzulegen.
Ich möchte jetzt aus meiner Datenbank die "Karteileichen" löschen, die sich vor längerer Zeit angemeldet haben und das Programm nicht weiter genutzt haben. Diejenigen, die ein Profil angelegt haben kann ich löschen, bei denjenigen, die kein Profil haben, gelingt es mir nicht "FOREIGN KEY constraint failed". Ich habe schon gemerkt, dass ich die Gruppenzuweisung "Schüler" löschen muss. Das reicht aber nicht. Wie bekomme ich raus, welche Beziehung hier noch besteht.

Code: Alles auswählen

def loeschen_alt(req):
    auswahl = User.objects.filter(date_joined__lt=date(2023,8,1))
    n=0 
    m=0
    nachricht = ""  
    for a in auswahl:
        if (a.date_joined.date() ) == ((a.last_login.date() )):
            user = Profil.objects.filter(user = a).first()
            aufgaben = Protokoll.objects.filter(user_id = a.id).count()
            n +=1
            m += aufgaben
            nachricht = str(a)
            if user == None:
                print(a, a.pk)
                nachricht += " hat kein Profil und"
            else:
                nachricht += ": " +user.vorname + " " + user.nachname+ " hat"
            nachricht += " sich nur einmal angemeldet, letzter Login: "+ str(a.last_login.date())+ " - Account wurde gelöscht"
            a.groups.clear()
            #print(nachricht)
            a.delete()
    nachricht = str(n) + " Accounts mit " + str(m) + " Aufgaben gelöscht"
    return HttpResponse(nachricht)
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pitwheazle: Ich glaube das Thema Namensgebung hatten wir schon mal. `n` und `m` sind keine guten Namen. Ebenso `a`. Oder `user` für ein `Profil`, insbesondere wenn es gleichzeitig auch `User`-Objekte gibt.

Da wird viel unnützes mit `nachricht` gemacht was dann überhaupt nicht verwendet wird. Und ich glaube Zeichenkettenformatierung statt `str()` und ``+`` hatten wird auch schon mal. Eventuell sogar, dass man Zeichenketten nicht wiederholt mit ``+`` oder ``+=`` in einer Schleife erweitert, weil das ineffizient ist, und stattdessen die Teilzeichenketten in einer Liste sammelt und dann am Ende mit der `join()`-Methode zusammensetzt.

Den Datumsvergleich könnte man auch gleich die Datenbank machen lassen. Dann bleibt das hier (ungetestet):

Code: Alles auswählen

def loeschen_alt(_request):
    kontenanzahl = 0
    aufgabenanzahl = 0
    for user in User.objects.filter(
        date_joined__lt=date(2023, 8, 1),
        date_joined__date=F("last_login__date"),
    ):
        kontenanzahl += 1
        aufgabenanzahl += Protokoll.objects.filter(user_id=user.id).count()
        user.groups.clear()
        user.delete()

    return HttpResponse(
        f"{kontenanzahl} Accounts mit {aufgabenanzahl} Aufgaben gelöscht"
    )
“I am Dyslexic of Borg, Your Ass will be Laminated” — unknown
Pitwheazle
User
Beiträge: 1050
Registriert: Sonntag 19. September 2021, 09:40

__blackjack__ hat geschrieben: Donnerstag 7. November 2024, 18:07 @Pitwheazle: Ich glaube das Thema Namensgebung hatten wir schon mal. `n` und `m` sind keine guten Namen. Ebenso `a`.
Da wird viel unnützes mit `nachricht` gemacht was dann überhaupt nicht verwendet wird.
Vielen dank soweit. An den Benenneungen arbeite ich. Und die Nachrichten werden schon verwendet, ich habe den Code gekürzt.
Das hilft mir aber bei der Fragestellung nicht weiter. Warum kann ich die User ohne Profil nicht löschen?
Benutzeravatar
sparrow
User
Beiträge: 4501
Registriert: Freitag 17. April 2009, 10:28

Wie lautet die komplette Fehlermeldung?
Soweit mir bekannt, kann dieser Fehler - der direkt aus der Datenbank kommt - nur passieren, wenn dort ein Foreign Key vorhanden ist, der Django nicht bekannt ist. Sonst würde Django eine Exception werfen.
Der Admin-Bereich zeigt dir beim Löschen auch die Objekte an, die geschützt sind oder mitgelöscht werden würden.
Vorausgesetzt deine Repräsentation im ORM entspricht der Datenbank.
Pitwheazle
User
Beiträge: 1050
Registriert: Sonntag 19. September 2021, 09:40

Die Fehlermeldung:

Code: Alles auswählen

[07/Nov/2024 22:39:02] "GET /admin/auth/user/108/delete/?_changelist_filters=p%3D13 HTTP/1.1" 200 11786[07/Nov/2024 22:39:02,519] - Broken pipe from ('127.0.0.1', 50296)
[07/Nov/2024 22:39:02,520] - Broken pipe from ('127.0.0.1', 50297)
[07/Nov/2024 22:39:02] "GET /staticfiles/admin/img/icon-addlink.svg HTTP/1.1" 200 331
Not Found: /favicon.ico
[07/Nov/2024 22:39:02,712] - Broken pipe from ('127.0.0.1', 50298)
C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\fields\__init__.py:1600: RuntimeWarning: DateTimeField User.date_joined received a naive datetime (2023-08-01 00:00:00) while time zone support is active.
  warnings.warn(
mail@example.com 108
Internal Server Error: /loeschen_alt/
Traceback (most recent call last):
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\base\base.py", line 299, in _commit
    return self.connection.commit()
sqlite3.IntegrityError: FOREIGN KEY constraint failed

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "D:\Dropbox\RechentrainerApp\rechentrainer.app\accounts\views.py", line 886, in loeschen_alt    
    a.delete()
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\base.py", line 1183, in delete
    return collector.delete()
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\models\deletion.py", line 459, in delete
    with transaction.atomic(using=self.using, savepoint=False):
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\transaction.py", line 263, in __exit__
    connection.commit()
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\utils\asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\base\base.py", line 323, in commit
    self._commit()
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\base\base.py", line 298, in _commit
    with debug_transaction(self, "COMMIT"), self.wrap_database_errors:
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\utils.py", line 91, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\Users\Pit\AppData\Local\Programs\Python\Python310\lib\site-packages\django\db\backends\base\base.py", line 299, in _commit
    return self.connection.commit()
django.db.utils.IntegrityError: FOREIGN KEY constraint failed
[07/Nov/2024 22:41:56] "GET /loeschen_alt/ HTTP/1.1" 500 105289
Not Found: /favicon.ico
[07/Nov/2024 22:41:56,568] - Broken pipe from ('127.0.0.1', 50376)
... und wenn ich den Nutzer im Admin Tool löschen will:
geraldfo
User
Beiträge: 72
Registriert: Samstag 28. Januar 2023, 20:19
Wohnort: Nähe Wien
Kontaktdaten:

Das mit den roten X-en ist aber keine geeignete Methode, um Daten unsichtbar zu machen.
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Zumal die E-Mail-Adresse noch mal im Klartext im Traceback steht. 😛
“I am Dyslexic of Borg, Your Ass will be Laminated” — unknown
geraldfo
User
Beiträge: 72
Registriert: Samstag 28. Januar 2023, 20:19
Wohnort: Nähe Wien
Kontaktdaten:

Zusätzlich steht die offenbar vertrauliche E-Mail-Adresse weiter oben im Klartext in der Fehlermeldung.
Benutzeravatar
Kebap
User
Beiträge: 760
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Pitwheazle hat geschrieben: Freitag 8. November 2024, 13:13:? :?
Suche mal im Code-Teil deines letzten Beitrags hier nach dem Klammeraffen @ und lösche die ganz fix da raus.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
Damaskus
Administrator
Beiträge: 999
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Die nächste Aufforderung zum löschen von Daten, kostet einen Kaffee...!
Bitte beim Posten ALLE Daten anonymisieren.
Antworten