python – SQLAlchemy等同于Django的annotate()方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – SQLAlchemy等同于Django的annotate()方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1448字,纯文字阅读大概需要3分钟。
内容图文
![python – SQLAlchemy等同于Django的annotate()方法](/upload/InfoBanner/zyjiaocheng/910/2f4d8f809e3945ba81a2123461d2e938.jpg)
我正在SQLAlchemy中进行这样的连接:
items = Item.query .outerjoin((ItemInfo, ItemInfo.item_id==Item.id))
items.add_columns(ItemInfo.count)
这会导致SQLAlchemy返回元组:
>>> items.first()
(<Item ...>, 2)
我更喜欢它,如果“count”值将作为项目的属性返回,即我想做:
>>> items.first().count
2
这支持吗?
解决方法:
实际上,“items.first().count”会起作用,因为你得到的元组是一个命名的元组……但猜测你不想看到items.first().item.foo.
第二种方法是通过一个构造所需结果的函数来运行query()的结果:
def process(q):
for item, count in q:
item.count = count
yield count
编辑:这是一个通用版本:
from sqlalchemy.orm.query import Query
class AnnotateQuery(Query):
_annotations = ()
def annotate(self, key, expr):
q = self.add_column(expr)
q._annotations = self._annotations + (key, )
return q
def __iter__(self):
if not self._annotations:
return super(AnnotateQuery, self).__iter__()
else:
for row in super(AnnotateQuery, self):
item, remaining = row[0], row[1:]
for i, key in enumerate(self._annotations):
setattr(item, key, remaining[i])
yield item
# session usage:
Session = sessionmaker(query_cls=AnnotateQuery)
# query usage:
q = Session.query(Item).outerjoin(...).annotate('count', Item.count)
第三,是你改变了Item类来支持这个功能.您可以使用column_property()将select子查询应用于您的类:http://www.sqlalchemy.org/docs/orm/mapper_config.html#sql-expressions-as-mapped-attributes.如果您希望将属性加载为条件,则使用deferred:http://www.sqlalchemy.org/docs/orm/mapper_config.html#deferred-column-loading.
内容总结
以上是互联网集市为您收集整理的python – SQLAlchemy等同于Django的annotate()方法全部内容,希望文章能够帮你解决python – SQLAlchemy等同于Django的annotate()方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。