49

我是 SQLAlchemy 菜鸟。

假设我有一个声明模式的用户表:

class User(Base):
    __tablename__ = 'user'
    id = Column(u'id', Integer(), primary_key=True)
    name = Column(u'name', String(50))

当我知道没有对象加载到会话中的用户 id 时,我会像这样更新这样的用户:

ex = update(User.__table__).where(User.id==123).values(name=u"Bob Marley")
Session.execute(ex)

我不喜欢使用User.__table__,我应该停止担心吗?

有一个更好的方法吗?

谢谢!

4

3 回答 3

64

ORM 级别还有一些更新功能。它还没有处理任何棘手的情况,但对于单行更新(或批量更新)的琐碎情况,它可以正常工作。它甚至会遍历任何已加载的对象并对其应用更新。你可以像这样使用它:

session.query(User).filter_by(id=123).update({"name": u"Bob Marley"})
于 2010-04-13T20:19:19.850 回答
20

您在这里处理子句级别,而不是模型/实体/对象级别。子句级别低于映射对象。是的,必须做一些事情才能将一个术语转换为其他术语。

您还可以保持在对象级别并执行以下操作:

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

但它会明显变慢,因为它会导致映射对象构造。而且我不确定它是否更具可读性。

在您提供的示例中,我看到了最自然和“正确”的解决方案。我不会担心小__table__魔法。

于 2010-04-13T18:24:07.727 回答
4

类似的功能可以通过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 中完成的。

于 2015-05-13T14:52:42.840 回答