Update bei SQLAlchemy

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

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.
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')
)
DaftWullie
User
Beiträge: 37
Registriert: Donnerstag 17. Mai 2012, 21:28

Das '==' innerhalb von values() müsste vermutlich ein '=' sein.
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

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. :)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@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.
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 = ?'
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@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"...?
Antworten