Подтвердить что ты не робот

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__, я должен перестать беспокоиться об этом?

Есть ли лучший способ сделать это?

Спасибо!

4b9b3361

Ответ 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.