简单案例:
可能的快速解决方案:从kwargs您的构造对象RowProxy,因为它们是类似对象的。
鉴于:
rowproxy = update(User) \
.values({'name': 'Wayne'}) \
.where(User.id == subquery.as_scalar()) \
.returning() \
.fetchone()
我们或许可以做到:
user = User(**dict(rowproxy.items()))
rowproxy.items()tuples对的回报key-value;dict(...)将 转换tuples为实际key-value对;并User(...)获取属性名称kwargs。model
更困难的案例:
但是,如果您有一个与 SQL 不完全相同的modelwhere怎么办?例如:attribute namestable column name
class User(ORMBase):
# etc...
user_id = Column(name='id', etc)
当我们尝试将我们解包rowproxy到User类中时,我们可能会收到如下错误:(TypeError: 'id' is an invalid keyword argument for User因为它是期待的user_id)。
现在它变脏了:我们应该围绕mapper如何从table属性获取model属性,反之亦然:
kw_map = {a.key: a.class_attribute.name for a in User.__mapper__.attrs}
这里,a.key是model attribute(和kwarg),a.class_attribute.name是table attribute。这给了我们类似的东西:
{
"user_id": "id"
}
好吧,我们实际上想要提供从rowproxy.
kwargs = {a.key: rowproxy[a.class_attribute.name] for a in User.__mapper__.attrs}
现在我们可以这样做:
user = User(**kwargs)
勘误表:
- 您可能希望
session.commit()在调用后update().returning()立即进行,以防止您的更改与当它们永久存储在数据库中时发生长时间的延迟。以后不需要session.add(user)- 您已经updated()并且只需要commit()该交易
object是 Python 中的关键字,所以尽量不要踩它;你可能会得到一些非常奇怪的行为;这就是为什么我重命名为rowproxy.