Hybrid   发布时间:2022-05-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Sqlalchemy杂交种大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个sqlalchemy(实际上是Flask-sqlalchemy因此所有的数据库.*),我希望能够通过他们与之相关的“投票”的平均投票价值来排序我的“事物”.投票的值为0到100.

遇到sqlalchemy想将average_Vote_value @attribute翻译成sql并且失败的问题我发现@R_650_10675@用hybrids

但是,我无法弄清楚在这种情况下如何做到这一点.有人可以帮忙吗?

class Thing(db.Model):
    id = db.column(db.Integer,priMary_key=TruE)
    name = db.column(db.String(80))
    Votes = db.relationship('Vote',BACkref='thing',lazy='dynamic')

    @hybrid_property
    def average_Vote_value(self):
        '''average of Vote.values'''
        values = [v.value for v in self.Votes]
        try:
            return sum(scores) / len(values)
        except ZeroDivisionError:
            return 50 # the default value

    average_Vote_value.expression
    def average_Vote_value(cls):
        pass ### Help ###


class Vote(db.Model):
    id = db.column(db.Integer,priMary_key=TruE)
    thing_id = db.column(db.Integer,db.ForeignKey('thing.id'))
    value = db.column(db.Float,default=50.0)

解决方法@H_450_15@
在一天结束时,您需要虑如何获得您想要的结果作为SQL查询.你不能仅仅从“混合,python,属性”等方面来虑它.然我们将使用这些技术来获得结果,但这是sql工作方式引领我们的方式.所以让我们使用POSTGResql,它内置AVG功能,大多数数据库都有.我们将需要从Thing加入投票,因为你想要虑Thing没有投票的情况,一个LEFT OUTER JOIN.混合表达式只是您想要的sql表达式的语法助手,但在一天结束时,您仍需要拼出sql所需的JOIN:

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.ext.declarative import declarative_base

Base= declarative_base()

class Thing(BasE):
    __tablename__ = 'thing'
    id = column(Integer,priMary_key=TruE)
    name = column(String(80))
    Votes = relationship('Vote',lazy='dynamic')

    @hybrid_property
    def average_Vote_value(self):
        '''average of Vote.values'''
        values = [v.value for v in self.Votes]
        try:
            return sum(values) / len(values)
        except ZeroDivisionError:
            return 50 # the default value

    @average_Vote_value.expression
    def average_Vote_value(cls):
        return func.coalesce(func.avg(Vote.value),50)


class Vote(BasE):
    __tablename__ = 'Vote'
    id = column(Integer,priMary_key=TruE)
    thing_id = column(Integer,ForeignKey('thing.id'))
    value = column(Float,default=50.0)

e = create_ENGIne("POSTGResql://scott:tiger@localhost/test",echo=TruE)
Base.Metadata.drop_all(E)
Base.Metadata.create_all(E)

s = Session(E)

s.add_all([
    Thing(name="thing1",Votes=[
        Vote(value=5),Vote(value=7),Vote(value=8),Vote(value=12),Vote(value=2),Vote(value=15),Vote(value=10),]),Thing(name="thing2",Votes=[
        Vote(value=18),Vote(value=16),Vote(value=27),Vote(value=6),Thing(name="thing3",Votes=[])
]
)
s.commit()

print s.query(Thing.name,Thing.average_Vote_value).\
            outerjoin(Thing.Votes).\
            group_by(Thing.Name).all()

输出(减去回声):

[(u'thing3',50.0),(u'thing1',8.22222222222222),(u'thing2',15.4)]

大佬总结

以上是大佬教程为你收集整理的Sqlalchemy杂交种全部内容,希望文章能够帮你解决Sqlalchemy杂交种所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。