SQLalchemy: лучший способ обновления с декларативным?

StackOverflow https://stackoverflow.com/questions/2631935

  •  26-09-2019
  •  | 
  •  

Вопрос

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

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

Спасибо!

Это было полезно?

Решение

Есть также некоторые возможности обновления на уровне 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__ магия.

Аналогичная функциональность доступна через update() Способ на таблице объект.

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top