Bottle und SQLAlchemy

Django, Flask, Bottle, WSGI, CGI…
Antworten
friedduck
User
Beiträge: 76
Registriert: Montag 23. Juli 2012, 20:41

Hallo,

ich experementiere grade mit Bottle und SqlAlchemy, was mir nicht ganz klar ist: muss ich zwingend das bottle-sqlalchemy plugin bür Bottle benutzen
oder kann ich SqlAlchemy "nativ" ansteuern.

Ich mein, wenn jemand solch ein plugin schreibt, denkt er sich doch was dabei, wo liegen denn da die Vorteile gegenüber
dem reinen SQLAlchemy?

Danke im voraus.
BlackJack

@friedduck: Probier's doch einfach mal ohne, dann siehst Du ja ob Du das wirklich willst. Du musst dann selber dafür sorgen, dass Du an das Sitzungsobjekt kommst und musst dafür sorgen das jedesmal nach der Verwendung ein `commit()` oder ein `rollback()` gemacht wird.
friedduck
User
Beiträge: 76
Registriert: Montag 23. Juli 2012, 20:41

Hallo BlackJack,

das session object brauche ich doch nur wenn ich etwas in die Datenbank schreiben oder aus der Datanbank löschen möchte, oder?
Ich mein, es ist schon eine erleichterung sich nicht mehr um commit() und rollback() kümmern zu müssen...

Ich hab hier einen Code ausschnitt, von der HP des Plugins.
Die Löschung eines Eintrags hat der Author mit "nativen" SQLAlchemy befehlen umgesetzt, also muss ich ja doch abundzu mit "nativen" Befehlen arbeiten.
Oder sehe ich das falsch?

Code: Alles auswählen

# imports to delete_name function
from sqlalchemy.orm import sessionmaker
from sqlalchemy.exc import SQLAlchemyError
create_session = sessionmaker(bind=engine)

@delete('/:name')
def delete_name(name):
    ''' This function don't use the plugin. '''
    session = create_session()
    try:
        user = session.query(User).filter_by(name=name).first()
        session.delete(user)
        session.commit()
    except SQLAlchemyError, e:
        session.rollback()
        raise bottle.HTTPError(500, "Database Error", e)
    finally:
        session.close()
BlackJack

@friedduck: Du hast den DocString von der Funktion gelesen?
friedduck
User
Beiträge: 76
Registriert: Montag 23. Juli 2012, 20:41

Meinst du ''' This function don't use the plugin. ''' ?

Entgeht mir grade etwas?
BlackJack

@friedduck: Ja das meinte ich. Deine Frage macht bei *der* Funktion also irgendwie keinen Sinn. Da siehst Du was Du machen musst, wenn Du das Plugin *nicht* verwendest.
friedduck
User
Beiträge: 76
Registriert: Montag 23. Juli 2012, 20:41

Es ergibt einen Sinn.

Die Frage ist ja, warum hat der Author des Plugins es so gemacht:
a. er wollte zeigen wie man SQLAlchemy nativ anspricht.
oder
b. die "Löschfunktion" ist nicht im Plugin implementiert, so das er halt diesen weg gehen muss.

Wenn Antwort b zutrifft, dann ist es wohl besser für mich als Anfänger SQLAlchemy nativ anzusprechen, finde ich.

Du hast mir schon mit deiner ersten Antwort sehr geholfen. Ich weiß jetzt das ich das Plugin nicht unbedingt brauche.
BlackJack

@friedduck: Selbst wenn b. zutreffen würde, wäre ziemlich unsinnig es in allen anderen Fällen es auch so umständlich zu machen. Das endet doch nur damit, dass Du das Rad neu erfindest und selber so ein Plugin schreibst. Es sei denn Du stehst auf umständlichen und fehleranfälligen Code den man für jede Route erneut schreiben muss.

Was das Plugin macht, kann man sich im Quelltext vom Plugin anschauen. Zusammen mit der Bottle-Dokumentation zur API von Plugins.
friedduck
User
Beiträge: 76
Registriert: Montag 23. Juli 2012, 20:41

ok, muss jeder für sich entscheiden.

Wenn mann aber seine Tabellen deklarative anlegt und die session selber initialisiert und sich darum kümmert, sind es nur ein paar zeilen mehr.
Es ist zu verkraften, finde ich.

Der Vorteil wird aber sehr wahrscheinlich darin liegen, wenn man auf ein anderes Framework wechselt und das gelernte
weiter verwenden kann.

Siehst du das anders?
BlackJack

@friedduck: Sehe ich anders, ja. Das sind in *jeder* Funktion immer wieder ein paar Zeilen nach dem selben Muster, das sollte man aber immer und überall richtig hinbekommen. Oder man nimmt ein Plugin was einem diese stupide, wiederkehrende Schreibarbeit erspart und in der Praxis getestet ist. Ich sehe auch nicht was das mit dem wiederverwenden von gelerntem zu tun hat. Bei einem anderen Rahmenwerk gibt es dafür auch einen Mechanismus, mindestens in Form eines Plugins. Oder man muss sich einen schreiben. Oder das Rahmenwerk taugt nichts.

Vielleicht noch mal ganz deutlich als Vergleich:

Code: Alles auswählen

@delete('/:name')
def delete_name(name):
    session = create_session()
    try:
        user = session.query(User).filter_by(name=name).first()
        session.delete(user)
        session.commit()
    except SQLAlchemyError, e:
        session.rollback()
        raise bottle.HTTPError(500, "Database Error", e)
    finally:
        session.close()


@delete('/:name')
def delete_name(name, db):
    user = db.query(User).filter_by(name=name).first()
    db.delete(user)
friedduck
User
Beiträge: 76
Registriert: Montag 23. Juli 2012, 20:41

ok, ok du hast mich überzeugt.

Es ist weniger Arbeit und der Code ist durch die verkürzte schreibweise extrem gut lesbar.
Ausserdem werden die exceptions durch das Plugin abgefangen und gleich als HTTP Fehler ausgegeben.

Dann habe ich auch noch eine andere Frage und zwar wie werden die urls bzw. forms generiert um die REST Api zu nutzen?
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ich verwende SQLAlchemy (bzw. SQLSoup) + Bottle ohne Plugin, funktioniert einwandfrei.

"Ohne Plugin" liegt aber in erster Linie daran, dass die Applikation noch aus einer Zeit stammt, als Bottle noch keine Plugins hatte. Vielleicht ändere ich das bezeiten mal... Obwohl: never touch a running system ;-)

Gruß, noisefloor
Antworten