bottle-sqlite+except

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Hallo

Ich nutze das bottle-sqlite Plugin. Gewisse Spalten einer Tabelle haben als Eigenschaft UNIQUE. Wenn nun der selbe Wert versucht wird einzutragen, dann kommt eine ``IntegrityError`` Fehlermeldung.

In der bottle_sqlite.py steht in Zeile 124-126:

Code: Alles auswählen

except sqlite3.IntegrityError as e:
    db.rollback()
    raise bottle.HTTPError(500, "Database Error", e)
Wie kann ich diesen Fehler nun abfangen in meiner Bottle app?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

`except bottle.HTTPError`?

Kommt mir aber komisch vor, dass da ein HTTPError geworfen wird ... Wenn du mehr Informationen brauchst kannst du auf `e.exception` zugreifen, wo dann der IntegrityError von SQLite drin sein sollte.
the more they change the more they stay the same
BlackJack

@lackschuh: Du musst halt ganz normal die Ausnahme behandeln.

@Dav1d: Was sollte denn Deiner Meinung nach sonst passieren?
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

@BlackJack
Stehe gerade etwas auf dem Schlauch. Ich will nicht ein nacktes ``except: return "Eintrag schon vorhanden" zurückgeben ans Template. Wie kann ich den Fehler abfangen, welcher in der bottle_sqlite.py passiert?

Edit:
versuche gerade Dav1d's Lösung
BlackJack

@lackschuh: Gar nicht, der passiert doch nicht da sondern vorher. Zeig doch mal *Deinen* Code — *da* musst Du den Fehler behandeln. Und zwar kein nacktes ``except:`` sondern den `sqlite3.IntegrityError` den Du da ja offensichtlich behandeln willst. Der darf gar nicht erst bis zum `bottle_sqlite`-Plugin gelangen.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

BlackJack hat geschrieben:@Dav1d: Was sollte denn Deiner Meinung nach sonst passieren?
Woops, ich ging davon aus das ist ein kleines ORM, fängt den IntegrityError und macht daraus einen HTTPError. Ist aber anscheinend andersrum, es fängt eine unbehandelte Exception und macht daraus den HTTPError.
the more they change the more they stay the same
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Morgen

Anbei der Code. Zum Testen verwende ich eine sqlite3 DB einer Bibliothek.

Code: Alles auswählen

import bottle.ext.sqlite
from bottle import Bottle, route, template, request, install, static_file, error

app = Bottle()
plugin = bottle.ext.sqlite.Plugin(dbfile='db/intranet.sqlite')
app.install(plugin)

@app.route('/bibliothek/neuer_verlag', method='POST')
def erstelle_eneun_verlag(db):
    form = NeuerVerlag(request.forms.decode())
    if form.validate():
        if request.forms.get('save'):
            try:
                verlagname = request.forms.get('verlagname')
                sql = """INSERT INTO verlag VALUES (NULL, ?)"""
                db.text_factory = str
                cur = db.execute(sql, (verlagname,))
                new_id = cur.lastrowid
                nachricht = 'ID: {}, Verlagname: {}'.format(new_id, verlagname)
                return template('content', nachricht=nachricht
            except:
                return template('content', nachricht='Verlag schon vorhanden')
    else:
        return template('neuer_verlag', nachricht=form.errors)
Vielleicht wäre es doch mal an der Zeit, mich mit sqlalchemy auseinanderzusetzen...
Antworten