Seite 1 von 1
Update bei SQLAlchemy
Verfasst: Samstag 21. Juni 2014, 09:06
von audacity363
Guten Morgen,
Ich bin zurzeit dabei mich ein wenig mit SQLAlchemy zu beschäftigen. An sich klappt auch alles gut aber der Update will nicht so ganze wie ich:
Hier erst einmal der Code:
Code: Alles auswählen
from sqlalchemy import *
meta = MetaData()
connection = create_engine("mysql://user:passwd@host/database")
meta.bind = connection
allgemein = Table("allgemein", meta, autoload=True)
connection.execute(update(allgemein)
.where(allgemein.c.id==1)
.values(allgemein.c.geschlecht=="male")
)
Bekomme dann für die Zeile 13 den Traceback:
AttributeError: Neither 'BinaryExpression' object nor 'Comparator' object has an attribute 'items'
Google spuckt leider auch keine brauchbaren Ergebnisse aus.
Re: Update bei SQLAlchemy
Verfasst: Samstag 21. Juni 2014, 10:14
von BlackJack
@audacity363: Du versuchst bei `values()` einen Vergleich zu übergeben, das geht nicht. Das müsste so aussehen:
Code: Alles auswählen
connection.execute(
update(allgemein).where(allgemein.c.id == 1).values(geschlecht='male')
)
Re: Update bei SQLAlchemy
Verfasst: Samstag 21. Juni 2014, 10:18
von DaftWullie
Das '==' innerhalb von values() müsste vermutlich ein '=' sein.
Re: Update bei SQLAlchemy
Verfasst: Samstag 21. Juni 2014, 14:34
von audacity363
Ohh okey so einfach. Habe immer nur Beispiele gesehen bei denen zwei Gleichzeichen verwendet wurde. Entweder bin ich zu lange wach oder irgendwas anderes ist kapput.

Re: Update bei SQLAlchemy
Verfasst: Samstag 21. Juni 2014, 14:57
von snafu
@audacity363: Doppelte Gleichheitszeichen stehen für einen Vergleich, bei dem ein Wahrheitswert heraus kommt, während ein einfaches Gleichheitszeichen für eine Zuweisung steht. Python erlaubt es, mithilfe der ``**kwargs``-Syntax beliebige Zuweisungen auch in der Signatur für aufrufbare Objekte mitzugeben und diese dann später wieder auszulesen. Das mag dir vielleicht etwas ungewöhnlich und neuartig vorkommen, aber in der Python-Welt trifft man Signaturen in dieser Art öfter mal an.
Re: Update bei SQLAlchemy
Verfasst: Samstag 21. Juni 2014, 16:00
von BlackJack
@snafu: <pedantic>Doppelte Gleicheitszeichen stehen für einen Vergleich, aber da muss kein Wahrheitswert bei heraus kommen. Insbesondere hier tut es das auch nicht, sondern es kommt dabei ein Objekt heraus welches die Vergleichsoperation repräsentiert, die dann für die Anfrage in eine entsprechende SQL-Operation umgesetzt wird.</pedantic>
Code: Alles auswählen
In [51]: expr = allgemein.c.geschlecht == 'male'
In [52]: expr
Out[52]: <sqlalchemy.sql.expression._BinaryExpression object at 0xa39fc6c>
In [53]: str(expr)
Out[53]: 'allgemein.geschlecht = :geschlecht_1'
In [54]: str(update(allgemein).where(allgemein.c.id == 1))
Out[54]: 'UPDATE allgemein SET id=?, geschlecht=? WHERE allgemein.id = ?'
Re: Update bei SQLAlchemy
Verfasst: Samstag 21. Juni 2014, 23:14
von snafu
@BlackJack: Natürlich kann man den ``==``-Operator mit allem möglichen überladen. Das was SQLAlchemy da erstellt, ist ja auf den Kontext bezogen immer noch ein Vergleich, bei dessen Anwendung im SQL-Kontext ein Wahrheitswert herauskommt - wenn auch kein "Python-Wahrheitswert". Wie würdest du es denn nennen? Vielleicht ja: "Token, das zum Aufruf der für das Objekt definierten Python-Methode für Vergleiche führt und eine Rückgabe liefern sollte, die in der Regel ein Python-Objekt von Typ ``bool`` ist"...?