简单案例:
可能的快速解决方案:从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 不完全相同的model
where怎么办?例如:attribute names
table
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
.