2011-01-04 25 views
2

Hallo Ich schreibe dieses kleine Frontend für eine Kundendatenbank für meinen Arbeitsplatz. Wir brauchten einfach etwas Leichtes und Einfaches, um Kunden, Aufgaben und dergleichen im Auge zu behalten.Python + SQlite3, mit Fremdschlüssel

Das wird etwas verwirrend, weil ich Python und SQL zur gleichen Zeit lerne, aber ich würde gerne den ganzen Fremdschlüssel-Relation Teil reibungslos arbeiten, bevor ich weitermache.

Was ich tun möchte, ist in der Lage sein, viele Aufgaben zu 1 Kunden

hier zugewiesen haben, ist ein Beispiel:

conn = sqlite3.connect(':memory:') 
cur = conn.cursor() 
cur.execute('''CREATE TABLE customers (custid INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, phone TEXT, email TEXT, notes TEXT)''') 
cur.execute('''CREATE TABLE tasks (taskid INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, notes TEXT, taskcust INTEGER, FOREIGN KEY(taskcust) REFERENCES customer(custid))''') 

cur.execute('''INSERT INTO customers (name, phone, email, notes) VALUES('Jeff', '555555', '[email protected]', 'balblalal')''') 
cur.execute('''INSERT INTO tasks (title, notes, taskcust) VALUES ('Toshiba A200', 'replace RAM, add 2 gigs', 1)''') 
cur.execute('''INSERT INTO tasks (title, notes, taskcust) VALUES ('WD External HDD', 'Diagnose, tick of death, hdd probably dead', 1)''') 

So, jetzt habe ich 2 Aufgaben zugewiesen ‚Jeff‘. Was, wenn ich Jeffs Kontaktdaten und alle seine Aufgaben ausdrucken möchte?

cur.execute('''SELECT * FROM customers where custid=1''') 
for row in cur: 
    for i in row: 
     print i 
cur.execute('''SELECT * FROM tasks WHERE taskcust=1''') 
for row in cur: 
    for i in row: 
     print i 

mache ich es richtig?

Antwort

2

Do

for row in cur: 
     for i in row: 
      print i 

unter cur.execute('''SELECT * FROM tasks WHERE taskcust=1''')

dass nicht indent Außerdem, ich denke, es ist alles so funktioniert, die Sie wollen. Fremdschlüssel sind nützlich, denn jetzt, wenn Sie den Kunden finden möchten, der Sie aufgefordert hat, "RAM zu ersetzen, fügen Sie 2 Konzerte hinzu", können Sie zurück zum Kundendatensatz gehen.

+0

danke der Einzug war nur ein Tippfehler :) wollte nur sicherstellen, dass ich es richtig gemacht habe. –

+0

Das habe ich mir gedacht. Ein schneller Fehler, bevor Sie ein Bit bekommen, abhängig von Ihrem Datenbanksystem, Fremdschlüssel werden erzwungen, wenn also ein Kunde mit der angegebenen ID nicht existiert, wenn Sie versuchen, eine Aufgabe einzufügen, kann die DB einen Fehler auslösen. – mklauber

+0

Ich denke, die Fremdschlüssel werden nicht ordnungsgemäß durchgesetzt. Ich kann eine Aufgabe für einen Kunden erstellen, der nicht existiert, und wenn ich einen Kunden lösche, bleiben die ihm zugewiesenen Aufgaben: S Scheint, dass das Ausland nur wie eine normale Integer-Spalte agiert ... –