SQLAlchemy: лучший способ для обновления с декларативным?
Я SQLAlchemy noob.
Скажем, у меня есть пользовательская таблица в декларативном режиме:
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__
, я должен перестать беспокоиться об этом?
Есть ли лучший способ сделать это?
Спасибо!
Ответы
Ответ 1
Также есть возможность обновления на уровне ORM. Он еще не справляется с какими-либо сложными случаями, но для тривиального случая обновления одной строки (или массового обновления) он работает нормально. Он даже просматривает все уже загруженные объекты и также применяет к ним обновление. Вы можете использовать его следующим образом:
session.query(User).filter_by(id=123).update({"name": u"Bob Marley"})
Ответ 2
Здесь вы работаете на уровне предложения, а не на уровне модели/объекта/объекта. Уровень предложения ниже, чем отображаемые объекты. И да, нужно что-то сделать, чтобы преобразовать одни термины в другие.
Вы также можете остановиться на уровне объекта и сделать:
session = Session()
u = session.query(User).get(123)
u.name = u"Bob Marley"
session.commit()
но он будет значительно медленнее, так как он приведет к построенной конструкции объектов. И я не уверен, что это более читаемо.
В приведенном примере я вижу наиболее естественное и "правильное" решение. Я не стал бы волноваться о малой магии __table__
.
Ответ 3
Аналогичная функциональность доступна с помощью метода update()
объекта 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')
Чтобы использовать User.__table__
, как это делается в SQLAlchemy.