python-将SQLAlchemy ORM与sql核心表达式中的对象连接在一起?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-将SQLAlchemy ORM与sql核心表达式中的对象连接在一起?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1970字,纯文字阅读大概需要3分钟。
内容图文
![python-将SQLAlchemy ORM与sql核心表达式中的对象连接在一起?](/upload/InfoBanner/zyjiaocheng/883/64b30baa04f24972ad0e133626ae13d5.jpg)
我必须使用SQLalchemy Core表达式来获取对象,因为ORM无法执行“更新并返回”. (ORM中的更新没有返回)
from sqlalchemy import update
class User(ORMBase):
...
# pure sql expression, the object returned is not ORM object.
# the object is a RowProxy.
object = update(User) .values({'name': 'Wayne'}) .where(User.id == subquery.as_scalar()) .returning() .fetchone()
什么时候
db_session.add(object)
它报告UnmappedInstanceError:类’sqlalchemy.engine.result.RowProxy’未映射.
我该如何将SQL表达式中的RowProxy对象放入ORM的身份映射中
?
解决方法:
简单的情况:
可能的快速解决方案:从RowProxy的kwarg构造对象,因为它们类似于对象.
鉴于:
rowproxy = update(User) .values({'name': 'Wayne'}) .where(User.id == subquery.as_scalar()) .returning() .fetchone()
我们也许可以做到:
user = User(**dict(rowproxy.items()))
rowproxy.items()返回键值对的元组; dict(…)将元组转换为实际的键值对;和User(…)对模型属性名称使用kwargs.
更困难的情况:
但是,如果您拥有一个其中属性名称之一与SQL表列名称不太相同的模型,该怎么办?例如.就像是:
class User(ORMBase):
# etc...
user_id = Column(name='id', etc)
当我们尝试将rowproxy拆包到User类中时,可能会出现以下错误:TypeError:’id’是User的无效关键字参数(因为它期望使用user_id).
现在变得肮脏了:我们应该在映射器周围,如何从表属性获取到模型属性,反之亦然:
kw_map = {a.key: a.class_attribute.name for a in User.__mapper__.attrs}
在这里,a.key是模型属性(和kwarg),而a.class_attribute.name是表属性.这给了我们类似:
{
"user_id": "id"
}
好吧,我们实际上想提供从rowproxy获得的值,该值除了允许类似对象的访问之外还允许类似dict的访问:
kwargs = {a.key: rowproxy[a.class_attribute.name] for a in User.__mapper__.attrs}
现在我们可以做:
user = User(**kwargs)
勘误表:
>您可能希望在调用update().returning()之后立即进行session.commit(),以防止由于更改而导致的长时间延迟(与将更改永久存储在数据库中时相比).以后不需要session.add(user)-您已经更新(),只需提交()该交易
> object是Python中的关键字,因此请不要踩它;这样做可能会导致一些非常奇怪的行为;这就是为什么我重命名为rowproxy的原因.
内容总结
以上是互联网集市为您收集整理的python-将SQLAlchemy ORM与sql核心表达式中的对象连接在一起?全部内容,希望文章能够帮你解决python-将SQLAlchemy ORM与sql核心表达式中的对象连接在一起?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。