Psycopg2 nach except cursor nicht mehr zugreifbar

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
3quin0x
User
Beiträge: 15
Registriert: Dienstag 3. August 2010, 16:50

Hi,

für ein Datenbankprojekt benutzen wir psycopg2 und Qt für die Guielemente.

Alles funktioniert bestens...bis auf eins: Angenommen jemand verletzt beim hinzufügen einer email z.B den Primärschlüssel.
Logischerweise wird eine Exception ausgelöst, nach auslösen, besteht die Verbindung zur Datenbank immer noch (man kann sich z.B als PersonalManager oder Admin erfolgreich anmelden, was jedoch nicht mehr geht, sind die ganzen aktualisierungen der QTableWidget.

Ein wenig code dazu:

Code: Alles auswählen

def insertAdmin(self,email,vname,name,pwd,strasse,hausnr,ort,plz,tel,gebdatum,typ):
        sql = """BEGIN;INSERT INTO benutzer VALUES('%s','%s','%s','%s','%s',%s,'%s',%s,'%s','%s','%s');COMMIT;""" % (email,vname,name,pwd,strasse,hausnr,ort,plz,tel,gebdatum,typ)
        try:
            self.cur.execute(sql)                       # Bsp. Email schon vohanden löst exception aus
            return "Benutzereintrag erfolgreich"
        except:
            return "Unable to insert into database"
wenn ich jetzt bestimmte Tabellen updaten möchte:

Code: Alles auswählen

def get_PriceList(self):
        try:
            self.cur.execute("""SELECT * FROM kategorie""")     
      #springt er von hier wieder in die exception, was er nicht machen sollte
            return self.cur.fetchall()
        except:
            return "Datenbank Zugriffsfehler"
Anscheinend ist das Cursor Element nicht mehr aktuell, aber wie vermeide ich das.
Falls mehr Infos erwünscht, bitte fragen.

Gruß
deets

anstatt den fehler einfach abzufangen, zeig ihn doch mal.
3quin0x
User
Beiträge: 15
Registriert: Dienstag 3. August 2010, 16:50

der erste war ja klar -> Schlüsselwertverletzung

jetzt zum interssanten:

Code: Alles auswählen

self.cur.execute("SELECT b_email,b_vorname,b_nachname,b_strasse,b_hausnr,b_ort,b_plz,b_telefonnr,b_geburtsdatum FROM benutzer WHERE b_benutzertyp='m'")
psycopg2.InternalError: FEHLER:  aktuelle Transaktion wurde abgebrochen, Befehle werden bis zum Ende der Transaktion ignoriert
3quin0x
User
Beiträge: 15
Registriert: Dienstag 3. August 2010, 16:50

Hi,

ok ich hab's ...einfach in den except-block ein -> cursor.execute("COMMIT;")

Gruss
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

3quin0x hat geschrieben:ok ich hab's ...einfach in den except-block ein -> cursor.execute("COMMIT;")
Im Fehlerfall würde ich ja eher ein ROLLBACK erwarten.
Antworten