Ich fang am besten mal mit einem kleinem Beispiel an:
Code: Alles auswählen
import sqlite3
DB = sqlite3.connect('Test.db')
Cursor = DB.cursor()
Cursor.execute("""CREATE TABLE if not exists Autos (
CarID INTEGER PRIMARY KEY,
Marke TEXT,
Modell TEXT)""")
Cursor.execute("""CREATE TABLE if not exists Fahrer (
Name TEXT,
Autos INTEGER,
FOREIGN KEY(Autos) references Autos(CarID))""")
Cursor.execute('INSERT INTO Autos (Marke, Modell) VALUES (?,?)', ["VW", "Golf"])
Cursor.execute('INSERT INTO Autos (Marke, Modell) VALUES (?,?)', ["Opel", "Astra"])
Cursor.execute('INSERT INTO Autos (Marke, Modell) VALUES (?,?)', ["Ford", "Mondeo"])
Cursor.execute('INSERT INTO Autos (Marke, Modell) VALUES (?,?)', ["Lada", "Niva"])
Cursor.execute('INSERT INTO Fahrer (Name) VALUES (?)', ["Klaus"])
Cursor.execute('INSERT INTO Fahrer (Name) VALUES (?)', ["Ingo"])
DB.commit()
DB.close()
Autos werden einem Fahrer in seinem Feld "Autos" über ihre CarID zugewiesen.
Wenn es nur eine 1:1 Beziehung gibt wäre der Weg über ForeignKey die wünschenswerte Beziehung.
Aber jeder Fahrer kann mehrere Autos haben!
Daher nun meine eigentliche Frage:
Wie bekomme ich eine ForeignKey-Beziehung mit einer 1:unendlich Beziehung hin?
Was ich bisher gelesen habe ist, ist das in sqlite dafür Strings genommen werden wo die IDs kommagetrennt (oder anders) eingetragen werden.
In dem Fall weiß ich aber nicht wie ich dann effektiv folgende gewünschte Features umsetze:
- Hinzufügen von Werten zu der ID-Liste
- Auslesen der Anzahl der IDs in der ID-Liste
- Prüfen ob eine ID in der ID-Liste vorkommt
- Entfernen von IDs aus der ID-Liste
Hoffe jemand kann hilfreiche Tipps geben wie ich das am besten umsetzen könnte.
Achja: Die einfache Umkehr dass man in dem Fall einfach einem Auto einen Fahrer zuweist und man somit nur noch einen Key hat ist zwar logisch soll in dem Fall aber nicht verwendet werden.
Eine zweite Frage hätte ich außerdem:
Prüft sqlite auf korrekte Datentypen?
Wenn ich einem Integer-Feld einen String zuweise wird er auch so in das Feld geschrieben und ist wieder auslesbar obwohl der Typ ja eindeutig falsch ist.
Würde ich z.B in meinem oberen Beispiel einem Fahrer als Wert für "Autos" den String "irgendwas" übergeben funktioniert das obwohl der Datentyp ja eigentlich Integer ist.