Umgang mit INTEGER PRIMARY KEY AUTOINCREMENT, in SQLite

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
foto2004
User
Beiträge: 16
Registriert: Samstag 27. Juni 2020, 12:57

Hallo Gemeinde,


ich habe da ein keines Problem an dem ich gerade nage.

ich versuche meine DB mit Datensätzen zu füllen und die Spalte id per Autoincrement zu durchnummerieren.

so wei so gut. Ich habe mich da anhand eines Tutorials entlang gehangelt und lt dieses Tutorials muss man die Spalte "id" die ja das Autoincrement hat nicht extra übergeben. Soweit ich mich zu erinnern glaube war das bei MySQL und PHP auch so.

Tja wenn ich das mache bekomme ich aber diese Fehlermeldung:

File "/Users/immanuelschade/Documents/PyQt/DB-Projekt/DBProjekt.py", line 91, in sqlEingabe
zeiger.execute("""
sqlite3.OperationalError: table personen has 6 columns but 5 values were supplied
Abort trap: 6

Code: Alles auswählen



def sqlEingabe():
    verbindung = sqlite3.connect("pers.db")
    zeiger = verbindung.cursor()
    sql_anweisung = """
    CREATE TABLE IF NOT EXISTS personen (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    vorname VARCHAR(20), 
    nachname VARCHAR(30), 
    geburtstag DATE,
    ref1 VARCHAR(30),
    knummer INTEGER
    );"""

    zeiger.execute(sql_anweisung)

    vorname    = eingabeWindow.lineEditVorname.text()
    nachname   = eingabeWindow.lineEditNachname.text()
    geburtstag = eingabeWindow.lineEditGeburt.text()
    ref1 = "t"
    knummer = 0

    zeiger.execute("""
                INSERT INTO personen 
                VALUES (?,?,?,?,?)
                """, 
                ( vorname, nachname, geburtstag, ref1, knummer)
                )
    
    verbindung.commit()
    verbindung.close()



wenn ich aber die "id" reinschreibe in die sql Anweisung so kommt das die "id" nicht definiert ist oder wenn ich sie definiere
dass es vom falschen Datentyp ist (id = '').

wo bitte ist mein Denkfehler?
noch ganz am Anfang vom Lernen ...
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Du musst das so machen:


Code: Alles auswählen

zeiger.execute("INSERT INTO personen (vorname, nachname, geburtstag, ref1, knummer) VALUES (?,?,?,?,?)",(vorname, nachname, geburtstag, ref1, knummer))
Also die Spaltennamen angeben in die die Values geschrieben werden sollen.
Zuletzt geändert von Jankie am Freitag 17. Juli 2020, 07:54, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du nicht alle Felder bei INSERT angibst, mußt Du die Feldnamen explizit auflisten.
Benutze keine kryptischen Abkürzungen, wenn Du Referentenstatus meinst, dann nenn es nicht ref1 und wenn du Kotztütennummer meinst, dann nenn das auch kotztuetennummer.
Datenbanken werden einmal initialisiert und nicht jedesmal, wenn man einen Datensatz hinzufügen will.
Alles was eine Funktion braucht, muß sie über ihre Argumente bekommen, hier felt zumindest eingabeWindow. Wobei eine Mischung aus Englisch und Deutsch in einem Wort sollte man vermeiden. Variablennamen werden komplett klein geschrieben, wie Funktionen auch.
foto2004
User
Beiträge: 16
Registriert: Samstag 27. Juni 2020, 12:57

Dankeschön genau das war es.

Ja ich weis meine Nehmen sind eigentlich nur mal so dahingeschrieben da ich das Ding nur für mich zum Lernen mache, also kein Projekt oder so und wenn ich mal wieder nachschauen erfreue ich mich an meinen (damals) komischen Namen aber ich kann dann meine Gedankengänge besser nachvollziehen, wird sich sicher im laufe der Zeit ändern.

Danke für eurer Bemühungen mich auf den rechten Weg zu bringen. Ich weiß dass ich oft ziemlich verdreht denke.
noch ganz am Anfang vom Lernen ...
Antworten