Python mit SQL

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
diefragerin
User
Beiträge: 10
Registriert: Samstag 8. Dezember 2018, 14:20

Hallo zusammen,

ich muss für ein Informatik Projekt eine Datenbank mit SQL in Python erstellen, mit der ich Sachen löschen, ändern, hinzufügen und anzeigen lassen kann.
Das Programm hab ich eigentlich fertig, aber da steht jetzt: "sqlite3.OperationalError: no such table: Autor"

Ich habe mehrere Tabellen erzeugt, genau nach dem gleichen Aufbau, aber nur die Tabelle Buch funktioniert...

Hat jemand eine Idee, woran das liegen könnte?

Die Tabellen hab ich so erstellt:

Code: Alles auswählen

##Hauptschleife
import sqlite3

conn = sqlite3.connect("buecherei.db")

cursor = conn.cursor()

##Datenbank erstellen
def erzeugeDB (conn):
    conn.cursor().execute('''CREATE TABLE Buch (
        ISBN INTEGER PRIMARY KEY,
        Autor VARCHAR (25),
        Titel VARCHAR(50),
        Verlag VARCHAR(50),
        Preis INTEGER,
        Genre VARCHAR(50))''')
        
    conn.cursor().execute('''CREATE TABLE Autor (
        AutorNr INTEGER PRIMARY KEY,
        Vorname VARCHAR(25),
        Nachname VARCHAR(25),
        Geburtsdatum DATE,)''')
    
    conn.cursor().execute('''CREATE TABLE Kunde (
        KundenNr INTEGER PRIMARY KEY,
        Vorname VARCHAR(25),
        Nachname VARCHAR(25),
        Geschlecht VARCHAR(5),
        Geburtsdatum DATE)''')
und um nicht gesagt zu bekommen, dass meine Datenbank bereits existiert das:

Code: Alles auswählen

def addBuch(conn):
    try:
        erzeugeDB (conn)                    
    except:
        pass
    c = conn.cursor()
    print("---------------\n Neues Buch einfügen...")
    ISBN = input("Bitte gib die ISBN ein: ")
    Autor = input("Bitte gib den Autor ein: ")
    Titel = input("Bitte gib den Titel ein: ")
    Verlag = input("Bitte gib den Verlag ein: ")
    Preis = input("Bitte gib den Preis ein: ")
    Genre = input("Bitte gib das Genre ein: ")
    c.execute("INSERT INTO Buch(ISBN, Autor, Titel, Verlag, Preis, Genre) VALUES (?, ?, ?, ?, ?, ?);",(ISBN, Autor, Titel, Verlag, Preis, Genre))
    conn.commit()

def addAutor(conn):
    try:
        erzeugeDB (conn)                    
    except:
        pass
    c = conn.cursor()
    print("---------------\n Neuen Autor einfügen...")
    AutorNr = input("Bitte gib die Autorennummer ein: ")
    Vorname = input("Bitte gib den Vorname ein: ")
    Nachname = input("Bitte gib den Nachname ein: ")
    Geburtsdatum = input("Bitte gib das Geburtsdatum ein: ")
    c.execute("INSERT INTO Autor(AutorNr, Vorname, Nachname, Geburtsdatum) VALUES (?, ?, ?, ?, ?);",(AutorNr, Vorname, Nachname, Geburtsdatum))
    conn.commit()

def addKunde(conn):
    try:
        erzeugeDB(conn)
    except:
        pass
    c = conn.cursor()
    print("---------------\n Neuen Kunden einfügen...")
    KundenNr = input("Bitte gib die KundenNr. ein: ")
    Vorname = input("Bitte gib den Vorname ein: ")
    Nachname = input("Bitte gib den Nachname ein: ")
    Geschlecht = "Falsches Geschlecht"
    while True:
        Geschlecht = input("Bitte gib das Geschlecht (w oder m) ein: ")
        if(Geschlecht=="m"):
            break
        elif(Geschlecht=="w"):
            break
    Geburtsdatum = input("Bitte gib das Geburtsdatum ein: ")
    c.execute("INSERT INTO Kunde(KundenNr, Vorname, Nachname, Geschlecht, Geburtsdatum) VALUES (?, ?, ?, ?, ?);",(KundenNr, Vorname, Nachname, Geschlecht, Geburtsdatum))
    conn.commit()
Wenn Ihr mir helfen könntet, wär ich euch sehr dankbar :)
Liebe Grüße
Die Fragerin
Benutzeravatar
sparrow
User
Beiträge: 4144
Registriert: Freitag 17. April 2009, 10:28

Also bei mir läuft erzeugeDB() nicht ohne Fehlermeldug durch.
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@diefragerin: Nackte ``except``\s sind eine doofe Idee. Entferne die und Du erfährst wahrscheinlich was das Problem ist.

Es macht auch keinen Sinn am Anfang jeder Funktion zu versuchen die Datenbank zu erstellen, was ja eine Operation ist, die man nur einmal ganz am Anfang machen muss. Bei vielen Anwendungen ist das auch gar nicht Bestandteil des Programms selbst, sondern der Installation des Programms.

Auf Modulebene sollten weder die Verbindung (die man auch gerne `connection` nennen kann) noch Cursor-Objekte erstellt werden. Da gehört nur Code hin der Konstanten, Funktionen, und Klassen definiert.

Man muss innerhalb einer Funktion nicht für jedes `execute()` einen neuen Cursor erstellen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen: Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

``if``/``elif`` sind keine Funktionen, das sollte man also auch nicht so schreiben als wären es welche. Die Klammern gehören da nicht hin.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@diefragerin: es gibt halt einen Grund, warum man niemals nakte excepts verwenden sollte und dann die Exception einfach ignorieren.
`conn` und erst recht nicht `cursor` haben etwas auf Modulebene verloren. Cursor sollte man nach Verwendung auch wieder schließen.
Datenbank-Tabellen sollten zudem bewußt einmal erzeugt werden, und nicht jedesmal, wenn man auf eine Tabelle zugreift.
if ist keine Funktion, die Klammern also unsinnig.
Die Pflichtangabe des Geschlechts das dann auch noch auf w oder m eingeschränkt ist, ist in der heutigen Zeit ein Zumutung. Es gibt kein falsches Geschlecht, zudem ist die Zuweisung aus Progrmmiersicht Quatsch, weil der Wert nie benutzt wird.
Kundendaten, die nicht für die Bearbeitung eines Auftrags gebraucht werden, sollten nicht erhoben werden (ebenso das Geburtsdatum).
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Der DB-Entwurf ist kaputt. ISBN ist keine ganze Zahl, da kann sogar das X als Buchstabe drin vorkommen, also kann man das nicht als INTEGER speichern. Ich würde sowieso mindestens für Buch eine künstliche ID, ohne irgend eine weiterreichende Bedeutung verwenden. Für Autor und Kunde wahrscheinlich auch.

`Buch.Autor` sollte ein Fremdschlüssel in die `Autor`-Tabelle sein. `Verlag` und `Genre` ebenfalls Fremdschlüssel in entsprechende Tabellen um Redundanz zu vermeiden. Buchpreise sind bei Dir ganze Zahlen‽

Autor und Kunde haben eine Schnittmenge an Daten die man in eine weitere Tabelle herausziehen könnte/sollte.

Bei Geschlecht ist `m` und `w` zu einschränkend. Nicht nur wegen `d`iverse an die man sich schon mal gewöhnen sollte, sondern auch weil diese Information nicht immer bekannt ist. Und man darf auch keine Firmen als Kunden haben, denn was trägt man denn da als Geschlecht ein? Die Längenbegrenzungen scheinen mir teilweise arg knapp gewählt zu sein.

Man sollte auch explizit mal überlegen ob wirklich alle Felder in allen Tabellen auch NULL sein können sollten. Ich denke ja nicht.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten