Seite 1 von 1

bottle-sqlite+except

Verfasst: Freitag 5. August 2016, 15:41
von lackschuh
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?

Re: bottle-sqlite+except

Verfasst: Freitag 5. August 2016, 15:59
von Dav1d
`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.

Re: bottle-sqlite+except

Verfasst: Freitag 5. August 2016, 16:58
von BlackJack
@lackschuh: Du musst halt ganz normal die Ausnahme behandeln.

@Dav1d: Was sollte denn Deiner Meinung nach sonst passieren?

Re: bottle-sqlite+except

Verfasst: Freitag 5. August 2016, 18:36
von lackschuh
@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

Re: bottle-sqlite+except

Verfasst: Freitag 5. August 2016, 18:47
von 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.

Re: bottle-sqlite+except

Verfasst: Freitag 5. August 2016, 19:34
von Dav1d
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.

Re: bottle-sqlite+except

Verfasst: Montag 8. August 2016, 06:56
von lackschuh
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...