@SQLite3: INSERT INTO erzeugt keine Werte

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
CaptnEjakulat
User
Beiträge: 2
Registriert: Mittwoch 12. Februar 2014, 09:27

Moins zusammen,

sicherlich gibt es haufenweise Beiträge dieser Art. Und ich entschuldige mich dafür, dass ich mich einfach zu einem neuerlichen Post dieser Art erdreiste. Aber ich möchte einfach eine Antwort zu meinem Problem finden. Dieses maltretiert mich seit ein paar Tagen und ich finde einfach keine Antwort.

Hier nun meine Fragestellung. Ich versuche Werte, ihres Zeichen Unicode (das könnt ihr mir wirklich glauben), in eine Tabelle mit dem folgenden Schema zu schreiben:

Code: Alles auswählen

CREATE TABLE bilder (id integer primary key autoincrement not null, name varchar(50), datum varchar(10) not null, zeit varchar(10) not null);
Die Tabelle soll ganz schnöde den Namen des Bildes enthalten. Zusätzlich werden das Datum und die Uhrzeit aus dem EXIF-Feld 'OriginalDateTime' abgelegt. Ich weiß, dass man auch DATE und TIME nehmen kann. Darum soll es hier nicht gehen. Das würde im Anschluss passieren, wenn denn mal das grundsätzliche Schreiben in die DB funzt.

Zurück zum Thema.

Ich les jede Datei aus und erhalte halt den Namen der Datei, das Datum und die Uhrzeit. Folgendes Schnippsel erläutert das Schreiben:

Code: Alles auswählen

db = sqlite3.connect(sqlite_file)
cursor = db.cursor()
for i in range(0,len(filename),1):
  timestamp = ()
  timestamp = <Hier ist ne Funktion, die ein Tupel nach dem Format ('YY','MM','DD','HH','MM','SS') zurückgibt>
  datum = "-".join(timestamp[0:3])
  zeit = ":".join(timestamp[3:])
  cursor.execute("""INSERT INTO bilder (name, datum, zeit) VALUES (?,?,?)""", (os.path.basename(filename[i]).lower(), unicode(datum), unicode(zeit)))
  del datum, timestamp, zeit
db.commit
print db.total_changes
cursor.close()
db.close()
Folgendes Phänomen hab ich nun. Ich nehme meine Dateien (Anzahl ist vollkommen egal; die kann variieren). Bei jeder erhalte ich relevante und vor allem korrekte Daten. Das INSERT INTO wird ausgeführt und es erscheint absolut kein Fehler. Selbst das 'total_changes' zeigt die korrekte Anzahl an Datensätzen an. ABER es wird KEIN Datensatz in die Tabelle geschrieben. Verbinde ich mich nach dem Schreibvorgang mit der DB und mache ein schnödes 'SELECT', ist kein Wert in der Tabelle vorhanden.

Um einfach mal zu prüfen, ob ich denn auch in der korrekten DB bin, hab ich den Namen der Tabelle verändert. Das wurde prompt mit einer entsprechenden Fehlermeldung bzw. Exception beantwortet.

Ich habe keinen Dunst, warum die Daten nicht im geringsten in die Tabelle geschrieben werden. Ich hab auch entsprechend dem PEP 249 das messages-Attribut für das Cursor und Connection-Objekt versucht zu lesen. Dummerweise ist das Attribut natürlich nicht vorhanden. Gibt es, mal als weitere Frage, ein Attribut, dass mir den aktuellen Status für das Cursor- unf Connection-Objekt ausgibt??

Hier noch nen paar Daten zur Umgebung:

OS: Arch
Python: python2-pysqlite 2.6.3-3, python2 2.7.6-1
SQLite: sqlite 3.8.3-1

Vielleicht habt ihr ja ne Meinung und seit nicht von meiner Fragestellung genervt.

Gruß und Danke

PS: Bitte hinerfragt nicht das Schema der Tabelle. Es ist einfach nur ein Beispiel. Sofern denn endlich mal der Schreibvorgang klappt, wird dieses angepasst.
Geht nicht, gibst nicht. Aber gibts nicht geht.
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

Hallo,
du must db.commit auch aufrufen: db.commit().

Gruß
Whitie
BlackJack

@CaptnEjakulat: Du musst die `commit()`-Methode auch *aufrufen*. Einfach nur die Methode vom Objekt abfragen und dann nichts damit machen hat keinen Effekt.

Die Schleife mit der Laufvariable die nur als Index in eine Sequenz verwendet wird ist ein „anti pattern” in Python. Da würde man stattdessen einfach ``for filename in filenames:`` schreiben. Falls man *zusätzlich* einen Index benötigt gibt es die `enumerate()`-Funktion. Und wenn man über mehrere Objekte parallel iterieren muss gibt es `zip()` bzw. `itertools.izip()`.

Die ``del``-Anweisungen machen keinen Sinn.
CaptnEjakulat
User
Beiträge: 2
Registriert: Mittwoch 12. Februar 2014, 09:27

Hallo werte Mitstreiter,

so schnell kanns gehen. Der Hinweis von Whitie und BlackJack hats gebracht. Anstatt 'db.commit' soll man doch lieber 'db.commit()' schreiben :mrgreen: .

Einen absolut fetten Dank an euch beide!! Ihr habt gerade meine zwei tägige Suche beendet.

@BlackJack: Deine Hinweise werden ich aufnehmen und einarbeiten.

Vielen lieben Dank nochmals!
Geht nicht, gibst nicht. Aber gibts nicht geht.
Antworten