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.
Bottle und SQLAlchemy
@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.
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?
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()
@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.
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.
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.
@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.
Was das Plugin macht, kann man sich im Quelltext vom Plugin anschauen. Zusammen mit der Bottle-Dokumentation zur API von Plugins.
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?
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?
@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:
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)
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?
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?
- noisefloor
- User
- Beiträge: 4149
- 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
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