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ć?
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"})
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ą.
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.
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