Python SQLAlchemy:使用声明更新的更好方法?

Python SQLAlchemy:使用声明更新的更好方法?,python,sqlalchemy,declarative,Python,Sqlalchemy,Declarative,我是炼金术高手 假设我有一个处于声明模式的用户表: 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

我是炼金术高手

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

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)
session.query(User).filter_by(id=123).update({"name": u"Bob Marley"})
我不喜欢使用
User.\uuuu table\uuuuu
,我应该停止担心吗

有更好的方法吗

谢谢

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

您还可以停留在对象级别上并执行以下操作:

session = Session()
u = session.query(User).get(123)
u.name = u"Bob Marley"
session.commit()
但由于它会导致映射对象的构造,因此速度会明显减慢。我不确定它是否更具可读性


在您提供的示例中,我看到了最自然和“正确”的解决方案。我不会担心什么
\uu table\uuu
魔术。

ORM级别也有一些更新功能。它还不能处理任何棘手的情况,但对于单行更新(或批量更新)这种琐碎的情况,它可以很好地工作。它甚至会检查任何已加载的对象,并对其应用更新。您可以这样使用它:

ex = update(User.__table__).where(User.id==123).values(name=u"Bob Marley")
Session.execute(ex)
session.query(User).filter_by(id=123).update({"name": u"Bob Marley"})

类似的功能可通过表对象上的
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.\uuuuu table\uuuuuuuuuu
是如何在SQLAlchemy中完成的。

这不考虑用户为列指定的变量名-如果名称被声明为User\u name=Column(“name”,String(50)),这将失败b/c需要实际的列名。有人能解释为什么会这样吗?应该是
。get(123)
还是
。filter\u by(id==123)
?@Brendan
filter
filter\u by
是不同的方法。前者使用表达式作为参数,而后者使用关键字参数。@Kira:响应延迟,但我会添加它,以防其他人需要它。session.query(User).filter_by(id=123).update({User.name:“Bob Marley”})@RichardLaw No,
FOR update
不是
update
语句的一部分,SQLA只是忽略
with_FOR_update()