SQLAlchemy: лучший путь к обновлению с описанием?

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

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

Спасибо!

45
задан Hadrien 8 February 2014 в 15:59
поделиться

2 ответа

Также есть возможность обновления на уровне ORM. Он пока не обрабатывает сложные случаи, но для тривиального случая обновления одной строки (или массового обновления) он отлично работает. Он даже перебирает любые уже загруженные объекты и применяет к ним обновление. Вы можете использовать его так:

session.query(User).filter_by(id=123).update({"name": u"Bob Marley"})
61
ответ дан 26 November 2019 в 21:17
поделиться

Здесь вы работаете на уровне предложения , а не на уровне модели / объекта / объекта. Уровень предложения ниже сопоставленных объектов. И да, что-то нужно сделать, чтобы преобразовать одни термины в другие.

Вы также можете остаться на уровне объекта и сделать:

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

, но это будет значительно медленнее, поскольку приводит к построению отображаемого объекта. И я не уверен, что он читабельнее.

В приведенном вами примере я вижу наиболее естественное и «правильное» решение. Я бы не стал беспокоиться о маленькой магии __ table __ .

17
ответ дан 26 November 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: