Daten werden in SQLite-DB nicht gespeichert

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
JeanCantos
User
Beiträge: 25
Registriert: Sonntag 26. November 2006, 17:08

Freitag 8. Mai 2009, 13:09

Hallo zusammen,

meine Übungen mit Python gehen weiter und wie nicht anders zu erwarten, treten die ersten Fragezeichen auf.

Mein Vorhaben: SQLite-DB erzeugen, Tabelle erzeugen und dort einen Datensatz eintragen.

Bis aus den letzten Punkt, funktioniert auch alles. Obwohl ich keine Fehlermeldung bekomme, wird der Datensatz nicht in der Datenbank gespeichert.

Anbei mein Code:

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-

import sqlite3

try:
    try:
        # Datenbank angeben (incl. absoluter Pfadangabe)
        nameDB = 'D:\sqliteDB.sqlite'

        # Verbindung zur Datenbank herstellen'
        connection = sqlite3.connect(nameDB)
    except:
        print('Fehler: Verbindung zur Datenbank')

    try:
        # Cursor-Objekt instanzieren
        cursor = connection.cursor()

        # SQL-Statement für Tabelle erzeugen
        sql =  'CREATE TABLE IF NOT EXISTS test ('\
                    'id INTEGER PRIMARY KEY, ' \
                    'name VARCHAR(50), ' \
                    'email VARCHAR(50));'

        # SQL-Statements an DB senden
        cursor.execute(sql)

    except:
        print('Fehler: Tabelle erzeugen')

    try:

        # Daten an DB senden
        cursor.execute('INSERT INTO test VALUES (null, ?, ?)', ("Hans", "Mustermann"))
    except:
        print('Fehler: Daten an DB senden')


    try:
        # Rückgabewert durchlaufen
        for row in cursor:
            print('-'*20)
            print('ID: ', row[0])
            print('Name: ', row[1])
            print('E-Mail: ', row[2])
            print('-'*20)

    except:
        print('Fehler: Rückgabewert durchlaufen')

finally:
    # Datenbankverbindung schließen
    connection.close
Gruß,

Jean
Zuletzt geändert von JeanCantos am Freitag 8. Mai 2009, 13:53, insgesamt 3-mal geändert.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Freitag 8. Mai 2009, 13:37

Dass du keine Fehlermeldung bekommst, ist dir selbst zuzuschreiben.
Ein unspezifiziertes `except` verschluckt jegliche Exception und lässt dem User - und in dem Fall dem Programmierer - keine Rückschlüsse auf Fehler zu.

Entweder kommentierst du erstmal deine Ausnahmebehandlung aus und schaust dir den Fehler an, der dich anspringt, oder du spezifizierst gleich, welchen du erwartest. Und zwar nicht über das `print` sondern über den Exception-Typ.

Und ruf das `close` am Ende auch auf -> `close()`
P.S. Nutzt du wirklich Python3 ?
JeanCantos
User
Beiträge: 25
Registriert: Sonntag 26. November 2006, 17:08

Freitag 8. Mai 2009, 13:41

Hallo cofi,

jetzt habe ich verstanden, was Du meinst. So funktioniert der Code nun (teilweise):

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-

import sqlite3

try:

    # Datenbank angeben (incl. absoluter Pfadangabe)
    nameDB = 'D:\sqliteDB.sqlite'

    # Verbindung zur Datenbank herstellen'
    connection = sqlite3.connect(nameDB)


    # Cursor-Objekt instanzieren
    cursor = connection.cursor()

    # SQL-Statement für Tabelle erzeugen
    sql =  'CREATE TABLE IF NOT EXISTS test ('\
                'id INTEGER PRIMARY KEY, ' \
                'name VARCHAR(50), ' \
                'email VARCHAR(50));'

    # SQL-Statements an DB senden
    cursor.execute(sql)

    # Daten an DB senden
    cursor.execute('INSERT INTO test VALUES (null, ?, ?)', ("Wer", "Noch"))

    # Änderungen übernehmen
    connection.commit()

    # Rückgabewert durchlaufen
    for row in cursor:
        print('-'*20)
        print('ID: ', row[0])
        print('Name: ', row[1])
        print('E-Mail: ', row[2])
        print('-'*20)

except IndentationError:
       print(' <--- Fehler: Beim Eintragen der Daten in die Datenbank ist es zu einem fehler gekommen --->')

finally:
    # Datenbankverbindung schließen
    connection.close()
Was nicht funktioniert ist:

Code: Alles auswählen

    # Rückgabewert durchlaufen
    for row in cursor:
        print('-'*20)
        print('ID: ', row[0])
        print('Name: ', row[1])
        print('E-Mail: ', row[2])
        print('-'*20)
Ich benutze Python 2.6.1. Wie kommst Du darauf, ich würde die 3.0.1 benutzen?

Gruß,

Jean
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Freitag 8. Mai 2009, 14:17

Wenn du kein Python3 benutzt, solltest du `print` nicht als Funktion benutzen, das gibt sonst Überraschungen.

Ein `IndentationError` ist kein Laufzeitfehler, sondern ist eine Sache die das Skript betrifft. Den Fehler solltest du korrigieren, nicht abfangen.

Bei deinem konkreten Problem kann ich dir nicht helfen. Da ziehe ich SQLAlchemy vor ;)

Aber zum Stil: 1. Du hast viel zu viele Leerzeilen und minimierst damit den Teil des Programms, den man auf einmal überblicken kann.
2. Du kommentierst so, dass du den Code in Klartext übersetzt. Das erzeugt keinen Mehrwert, lenkt ab und lässt sich nur schwer warten. Schlimmer als keine Dokumentation ist Dokumentation die dem Code widerspricht.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Freitag 8. Mai 2009, 14:38

JeanCantos hat geschrieben: Was nicht funktioniert ist:

Code: Alles auswählen

    # Rückgabewert durchlaufen
    for row in cursor:
        print('-'*20)
        print('ID: ', row[0])
        print('Name: ', row[1])
        print('E-Mail: ', row[2])
        print('-'*20)
Du koenntest uns ruhig genauer verraten, was "nicht funktioniert" bedeutet...

In diesem Fall wird die Schleife gar nicht durchlaufen, da der cursor "leer" ist, du willst wahrscheinlich vorher noch sowas haben:

Code: Alles auswählen

cursor.execute("SELECT * FROM test")
Damit liest du Daten aus der Datenbank ein.

Allgemeiner Tipp: Lass try/exepts am Anfang erstmal weg, ueberleg dir woher die Fehler kommen und wie du sie behebst. Erst wenn du dir sicher bist, dass die Ausnahme kein Programmierfehler ist, behandel sie entsprechend.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Antworten