SQLAlchemie: ein besserer Weg zum Update mit deklarativen?

Ich bin eine SQLAlchemie noob.

Angenommen, ich habe eine Benutzertabelle im deklarativen Modus:

class User(Base): __tablename__ = 'user' id = Column(u'id', Integer(), primary_key=True) name = Column(u'name', String(50)) 

Wenn ich die Benutzer-ID kenne, ohne dass das Objekt in die Sitzung geladen wurde, aktualisiere ich diesen Benutzer wie folgt:

 ex = update(User.__table__).where(User.id==123).values(name=u"Bob Marley") Session.execute(ex) 

Ich mag nicht mit User.__table__ , sollte ich aufhören, mich User.__table__ ?

Gibt es einen besseren Weg, dies zu tun?

Vielen Dank!

  • SQLAlchemy Union Parenthesis Ausgabe
  • SQLAlchemy: update from_select
  • Wie man Daten in sqlalchemy nach Liste sortiert
  • SQLAlchemy Viele-zu-Viele-Beziehung auf einem einzigen Tisch
  • Sqlalchemy insert data funktioniert nicht
  • Wie kann ich verhindern, dass sqlalchemy die Spaltennamen eines CTE präfixiert?
  • Vergleich von Daten mit SQLAlchemy, SQLite
  • Python SqlAlchemy generiert Tabellenklassen pragmatisch
  • 3 Solutions collect form web for “SQLAlchemie: ein besserer Weg zum Update mit deklarativen?”

    Es gibt auch einige Update-Fähigkeiten auf der ORM-Ebene. Es handelt sich um keine kniffligen Fälle, aber für den trivialen Fall von Einzelreihen-Update (oder Bulk-Update) funktioniert es gut. Es geht sogar über alle bereits geladenen Objekte und wendet das Update auf sie auch an. Sie können es so verwenden:

     session.query(User).filter_by(id=123).update({"name": u"Bob Marley"}) 

    Du arbeitest hier auf Klauselebene , nicht auf Modell / Entity / Objekt Ebene. Klausel ist niedriger als abgebildet. Und ja, es muss etwas getan werden, um eine Begriffe in andere umzuwandeln.

    Sie könnten auch auf Objekt-Ebene bleiben und tun:

     session = Session() u = session.query(User).get(123) u.name = u"Bob Marley" session.commit() 

    Aber es wird deutlich langsamer sein, da es zu der abgebildeten Objektkonstruktion führt. Und ich bin mir nicht sicher, dass es besser lesbar ist.

    Im Beispiel habe ich die natürlichste und "richtige" Lösung. Ich würde mir keine Sorgen um die kleine Magie machen.

    Ähnliche Funktionalität ist über die Methode update() auf dem Tabellenobjekt verfügbar.

     class User(Base): __tablename__ = 'user' id = Column('id', Integer(), primary_key=True) name = Column('name', String(50)) stmt = User.__table__.update().where(User.id==5).values(name='user #5') 

    Zur Verwendung von User.__table__ ist, wie es in SQLAlchemy gemacht ist.

    Python ist die beste Programmiersprache der Welt.