Warum erhalte ich eine Nichtübereinstimmung des Fremdschlüssels, wenn ich versuche, zwei Tabellen mithilfe von FremdschlPython

Python-Programme
Anonymous
 Warum erhalte ich eine Nichtübereinstimmung des Fremdschlüssels, wenn ich versuche, zwei Tabellen mithilfe von Fremdschl

Post by Anonymous »

Ich schreibe Kapitel 16 – SQLite-Datenbanken von „Automatisieren Sie langweilige Dinge mit Python“ von Al. Sweigart und ich sind im Teil „Mehrere Tabellen mit Fremdschlüsseln verbinden“ auf ein Problem gestoßen. Lassen Sie mich wissen, dass ich gerade erst angefangen habe, mich mit Python zu beschäftigen, und zum ersten Mal etwas über Datenbanken und SQLite lerne.
Ich habe eine Datei namens sweigartcats.db, die eine Tabelle namens „cats“ enthält. Dies sind ihre Spalten:

Code: Select all

>>> conn.execute('PRAGMA TABLE_INFO(cats)').fetchall()
[(0, 'name', 'TEXT', 1, None, 0), (1, 'birthdate', 'TEXT', 0, None, 0), (2, 'fur', 'TEXT', 0, None, 0), (3, 'weight_kg', 'REAL', 0, None, 0)]
Das Tutorial zeigt, wie man eine weitere Tabelle mit dem Namen „Impfungen“ (die erfolgreich erstellt wurde) mit der folgenden Struktur erstellt:

Code: Select all

>>> conn.execute('CREATE TABLE IF NOT EXISTS vaccinations (vaccine TEXT,
date_administered TEXT, administered_by TEXT, cat_id INTEGER,
FOREIGN KEY(cat_id) REFERENCES cats(rowid)) STRICT')
Die in die Impftabelle eingefügten Werte verwenden die Zeilen-ID der Katzentabelle, um Impfdaten mit einer ausgewählten Katze zu verknüpfen. In diesem Fall hat die Katze „Zophie“ die Zeilen-ID 1:

Code: Select all

>>> conn.execute('INSERT INTO vaccinations VALUES ("rabies", "2023-06-06", "Dr. Echo", 1)')
Anstatt jedoch ein Cursor-Objekt zurückzugeben, erhalte ich eine Fehlermeldung:

Code: Select all

sqlite3.OperationalError: foreign key mismatch - "vaccinations" referencing "cats"
Heute ist dieser Fehler aus irgendeinem Grund nicht aufgetreten, als ich die Werte eingefügt habe (ich kann mich nicht erinnern, etwas anderes gemacht zu haben) und es ist mir gelungen, den folgenden Code zu verwenden, um ein Tupel zurückzugeben, das die Rowid-Katze und ihre Impfstoffdaten verbunden hat:

Code: Select all

>>> conn.execute('SELECT * FROM cats INNER JOIN vaccinations ON cats.rowid =
vaccinations.cat_id').fetchall()
Aber das hielt nicht an, da direkt daneben der Fremdschlüssel-Nichtübereinstimmungsfehler auftrat, als ich versuchte, die Datenbank mit iterdumps() in eine TXT-Datei zu kopieren. Ich habe viele Male versucht, es mit der Originaldatei zu wiederholen, aber der Fehler tritt immer auf und ich kann nichts mehr in die Impftabelle einfügen (selbst wenn ich den Code direkt von der Website kopiere, um sicherzustellen, dass es sich nicht um einen Tippfehler handelt).
Ich bin mir nicht sicher, ob Es wird benötigt, aber hier sind die Abfragen, die zum Erstellen der Originaldatei verwendet wurden: https://pastebin.com/neG0q4Ai
Ich habe die SQLite3-Dokumente und einige Fragen hier überprüft und anscheinend könnte es ein Problem mit der Verwendung von rowid als Fremdschlüssel geben, aber ich bin damit nicht sehr vertraut, daher kann ich nicht sicher sein, auch die Tatsache, dass es im Buch ohne Rücksicht auf Fehler steht und ich in dieser speziellen Lektion niemanden mit dem gleichen Fehler finden konnte, könnte ein Grund dafür sein Ich verstehe etwas falsch.
Eines der Übungsprogramme am Ende dieses Kapitels besteht darin, die Impfungen der Katzen zu überprüfen, sodass ich es nur tun kann, wenn ich es zuerst hinbekomme.
Ich entschuldige mich, wenn ich vergessen habe, eine wichtige Information hinzuzufügen, und ich werde sie bei Bedarf hinzufügen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post