Daten in SQLite eingetragen, aber nicht ausgegeben

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
m
User
Beiträge: 5
Registriert: Sonntag 1. Februar 2009, 18:10

Dienstag 17. Februar 2009, 17:54

Hallo Mitglieder des Python Forums!

Hoffentlich geht mein erster Post hier nicht gleich in die Hose, aber ich habe ein Problem mit Python und SQLite.

Folgender Code:
db.py

Code: Alles auswählen

import sqlite3

connection = sqlite3.connect("finanzen.db")
cursor = connection.cursor()
createdb.py (einmal ausgeführt)

Code: Alles auswählen

import db

db.cursor.execute("""CREATE TABLE benutzer (
	benutzerID INTEGER PRIMARY KEY AUTOINCREMENT,
	benutzername TEXT)""")

db.cursor.execute("""CREATE TABLE einnahmen (
	einnahmenID INTEGER PRIMARY KEY AUTOINCREMENT,
	text TEXT,
	januar REAL,
	februar REAL,
	maerz REAL,
	april REAL,
	mai REAL,
	juni REAL,
	juli REAL,
	august REAL,
	september REAL,
	oktober REAL,
	november REAL,
	dezemeber REAL)""")

db.cursor.execute("""CREATE TABLE ausgaben (
	einnahmenID INTEGER PRIMARY KEY AUTOINCREMENT,
	text TEXT,
	januar REAL,
	februar REAL,
	maerz REAL,
	april REAL,
	mai REAL,
	juni REAL,
	juli REAL,
	august REAL,
	september REAL,
	oktober REAL,
	november REAL,
	dezemeber REAL)""")
user.py

Code: Alles auswählen

from db import *

print "Benutzer-Konfiguration"
print "----------------------"

cursor.execute("SELECT benutzername FROM benutzer")
print cursor.fetchall()

print "----------------------"
print "[1] neuer Benutzer"
print "[2] Benutzer aendern"
print "[3] Benutzer loeschen"
print "[0] Beenden"

wahl = raw_input("Waehlen Sie: ")

if wahl == '1':
	name = raw_input("Benutzername: ")
	bestaetigung = raw_input("Moechten Sie den Benutzer anlegen? (j/n)")
	if bestaetigung == 'j':
		cursor.execute("INSERT INTO benutzer (benutzername) VALUES (?)", (name,))
elif wahl == '2':
	pass
elif wahl == '3':
	pass
else:
	exit()
:arrow: Ich habe jetzt das Problem, dass keine Fehlermeldung erscheint, wenn ich einen neuen Benutzer anlege. Allerdings wird mir auch keiner zwischen den beiden horizontalen Linien ausgegeben.
Aber liegts jetzt an der Ein- oder Ausgabe?

Danke vorab für eure Hilfe!
Zuletzt geändert von m am Mittwoch 18. Februar 2009, 11:06, insgesamt 1-mal geändert.
Benutzeravatar
martin101986
User
Beiträge: 85
Registriert: Montag 3. Dezember 2007, 19:15
Wohnort: Steiermark, Österreich

Dienstag 17. Februar 2009, 20:58

Hallo,

probiers mal mit einem connection.commit() nach dem Aufruf von cursor.execute .

Grüße

Martin
m
User
Beiträge: 5
Registriert: Sonntag 1. Februar 2009, 18:10

Dienstag 17. Februar 2009, 23:08

martin101986 hat geschrieben:probiers mal mit einem connection.commit() nach dem Aufruf von cursor.execute .
Leider keine Veränderung.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Dienstag 17. Februar 2009, 23:33

Machst du auch einen commit in der ``createdb.py``? (Einmal ganz am Ende.)

Was sagt denn:

Code: Alles auswählen

for line in connection.iterdump():
  print line
Zu deinem SQL, da du die Ausgaben und Einnahmen bestimmt einem Benutzer zuordnen willst, solltest du in den zwei Tabellen z.B. noch ein:
benutzerID INTEGER REFERENCES benutzer
unterbringen.
m
User
Beiträge: 5
Registriert: Sonntag 1. Februar 2009, 18:10

Mittwoch 18. Februar 2009, 09:17

ice2k3 hat geschrieben:Machst du auch einen commit in der ``createdb.py``?
Hab' ich jetzt mal dazu geschrieben, aber die Datenbank wird auch ohne erstellt. Zumindest seh ich dort ein File "finanzen.db".
ice2k3 hat geschrieben:Was sagt denn:

Code: Alles auswählen

for line in connection.iterdump():
  print line

Code: Alles auswählen

Traceback (most recent call last):
  File "user.py", line 9, in <module>
    for line in connection.iterdump():
AttributeError: 'sqlite3.Connection' object has no attribute 'iterdump'
ice2k3 hat geschrieben:Zu deinem SQL, da du die Ausgaben und Einnahmen bestimmt einem Benutzer zuordnen willst, solltest du in den zwei Tabellen z.B. noch ein:
benutzerID INTEGER REFERENCES benutzer
unterbringen.
Ich dachte dass dann erst in Python zu "verknüpfen". Aber so ist es eventuell noch ein bisschen besser.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 18. Februar 2009, 09:27

m hat geschrieben:
martin101986 hat geschrieben:probiers mal mit einem connection.commit() nach dem Aufruf von cursor.execute .
Leider keine Veränderung.
Doch, das ist der richtiger Tipp und es funktioniert.

Alternativ kannst du (was ich aber nicht empfehlen würde)
den Auto-Commit-Modus einschalten:

Code: Alles auswählen

connection.isolation_level = None
Stefan
m
User
Beiträge: 5
Registriert: Sonntag 1. Februar 2009, 18:10

Mittwoch 18. Februar 2009, 09:36

sma hat geschrieben:
m hat geschrieben:
martin101986 hat geschrieben:probiers mal mit einem connection.commit() nach dem Aufruf von cursor.execute .
Leider keine Veränderung.
Doch, das ist der richtiger Tipp und es funktioniert.
:?: Bei mir funktioniert's nicht.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 18. Februar 2009, 09:42

m hat geschrieben::?: Bei mir funktioniert's nicht.
Ich habe deinen Code in eine Datei gecopyundpasted, ein `connection.commit()` hinter dem INSERT eingefügt und laufen lassen.

Und es geht ;)

Stefan
m
User
Beiträge: 5
Registriert: Sonntag 1. Februar 2009, 18:10

Mittwoch 18. Februar 2009, 11:05

Shit! Tatsächlich. Ich hatte das vorhin falsch verstanden und das commit an die falsche Stelle gesetzt. Wenn ich's an's Ende der ersten verzweigung setze funktioniert's tatsächlich.

Danke!
Antworten