Was soll es tun?
Wie ich das sehe, soll das wohl eine Art "Kontoklasse" mit persistenter Speicherung sein? Da frage ich mich spontan: Wieso nicht wirklich eine Klasse für ein Konto?
create() und watch() würd eich in create_konto() und show_konto() umbenennen. Alles zu printen, anstatt eine Liste mit Objekten (oder eben anderen Datentypen mit den Daten drin) zurückzugegeben macht es als "Library" irgend wie ziemlich unnütz.
Wieso verschiedene update-Funktionen? Auch hier wäre eine Klasse besser, die sich selbst drum kümmert, wann sich Daten geändert haben und diese dann in die DB schreibt. Und wenn schon ohne, dann würde ich dennoch nur eine Funktion schreiben, die alle Daten eines Kunden übergeben bekommt und dann einfach das update durchführt.
Generell ist da zu wenig kommentiert, DocStrings wurden gar nicht benutzt! Ohne diese ist ein Modul aber komplett unbrauchbar und kann quasi nicht wirklich beutzt werden, da man nicht nachgucken kann, was z.B. eine Funktion genau macht.
Deine Queries sind teilweise nicht gegen SQL-Injection geschützt!
[wiki]Parametrisierte SQL-Queries[/wiki]?highlight=(sql)
Die Spielerei mit der ID in delete() finde ich auf den ersten schnellen Blick gewagt! Überlass das lieber der DB, eine numerische ID zu vergeben. Wozu gibt es auto_increment? Vermutlich hast Du da bei DBs noch keine Ahnung. Zumindest sieht es in create() sehr abenteuerlich aus, wie Du die höchste ID rausfindest! Wie gesagt, das kann man getrost der DB überlassen!
Willst Du wirklich Code auf Modulebene ausführen lassen? Wieso ist der Pfad zur DB hart codiert? Packe das Initialisieren besser in eine Funktion mit dem Pfad als Parameter!
So was ist unschön und unnötig!
Code: Alles auswählen
for p in c.execute("select Max(id) from person"):
nr = p[0]
Dafür gibt es fetchone() (Aber wie schon mehrfach erwähnt: Nutze auto_increment!)
Im folgenden else-Zweig ist redundanter Code! Diese Abfrage hattest Du doch schon in Zeile 17 und 18 gemacht!
Code: Alles auswählen
data =[(nr, name, kontonummer, kontostand)]
for t in data:
c.execute("INSERT INTO person VALUES (?, ?, ?, ?)", t)
Wozu dieses komplexe data-Konstrukt? ich meine du erstellst für genau ein Element eine Liste! (Wozu?) Da rein packst Du ein Tupel aus bekannten Variablen! (Wozu?)
So geht's doch auch:
Code: Alles auswählen
c.execute("INSERT INTO person VALUES (?, ?, ?, ?)", (nr, name, kontonummer, kontostand))
Die watch() Funktion ist ein komplettes Desaster! Wozu diese ganzen Tests? Hast Du mal eine query abgesetzt, die nach einem Eintrag mit einer bestimmten ID sucht, die nicht existiert? Wenn nein, versuche es einfach mal
Sollte kein eintrag dabei sein, so kann man entweder ein None zurückliefern oder eine exception werfen!
So, das auf den ersten Blick.