Я - новичок SQLAlchemy.
Скажем, у меня есть пользовательская таблица в декларативном режиме:
class User(Base):
__tablename__ = 'user'
id = Column(u'id', Integer(), primary_key=True)
name = Column(u'name', String(50))
Когда я знаю идентификатор пользователя без объекта, загруженного в сессию, я обновляю такого пользователя как это:
ex = update(User.__table__).where(User.id==123).values(name=u"Bob Marley")
Session.execute(ex)
Мне не нравится использовать User.__table__
, я должен прекратить волноваться с этим?
Существует ли лучший способ сделать это?
Спасибо!
Также есть возможность обновления на уровне ORM. Он пока не обрабатывает сложные случаи, но для тривиального случая обновления одной строки (или массового обновления) он отлично работает. Он даже перебирает любые уже загруженные объекты и применяет к ним обновление. Вы можете использовать его так:
session.query(User).filter_by(id=123).update({"name": u"Bob Marley"})
Здесь вы работаете на уровне предложения , а не на уровне модели / объекта / объекта. Уровень предложения ниже сопоставленных объектов. И да, что-то нужно сделать, чтобы преобразовать одни термины в другие.
Вы также можете остаться на уровне объекта и сделать:
session = Session()
u = session.query(User).get(123)
u.name = u"Bob Marley"
session.commit()
, но это будет значительно медленнее, поскольку приводит к построению отображаемого объекта. И я не уверен, что он читабельнее.
В приведенном вами примере я вижу наиболее естественное и «правильное» решение. Я бы не стал беспокоиться о маленькой магии __ table __
.