SQLAlchemy: lepszy sposób na aktualizację z deklaratywnym?

Jestem noobem SQLAlchemy.

Załóżmy, że mam tabelę użytkownika w trybie deklaratywnym:

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

Gdy znam id Użytkownika bez obiektu załadowanego do sesji, aktualizuję takiego użytkownika tak:

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

Nie lubię używać User.__table__, mam przestać się tym martwić?

Czy jest na to lepszy sposób? Dzięki!
Author: Hadrien, 2010-04-13

3 answers

Istnieje również możliwość aktualizacji na poziomie ORM. Nie obsługuje jeszcze żadnych trudnych przypadków, ale w przypadku trywialnego przypadku aktualizacji jednego wiersza (lub aktualizacji zbiorczej) działa dobrze. To nawet przechodzi na wszystkie już załadowane obiekty i stosuje aktualizację na nich również. Możesz go używać w ten sposób:

session.query(User).filter_by(id=123).update({"name": u"Bob Marley"})
 63
Author: Ants Aasma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 20:19:19

Pracujesz na poziomieklauzuli , a nie na poziomie modelu/encji/obiektu. Poziom klauzuli jest niższy niż mapowane obiekty. I tak, trzeba coś zrobić, aby przekształcić jeden termin w inny.

Możesz również pozostać na poziomie obiektu i wykonać:

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

Ale będzie to znacznie wolniejsze, ponieważ prowadzi do budowy mapowanego obiektu. I nie jestem pewien, czy jest bardziej czytelny.

W podanym przez Ciebie przykładzie widzę najbardziej naturalne i" właściwe " rozwiązanie. Ja bym nie zamartwiaj się małą magią.

 19
Author: nkrkv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 18:24:07

Podobna funkcjonalność jest dostępna za pomocą metody update() w obiekcie Table.

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')

Aby użyć User.__table__ jest jak to zrobić w SQLAlchemy.

 4
Author: The Demz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-13 14:52:42