遇到sqlalchemy想将average_Vote_value @attribute翻译成sql并且失败的问题我发现我应该使用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)解决方法 在一天结束时,您需要考虑如何获得您想要的结果作为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_propertyfrom sqlalchemy.ext.declarative import declarative_baseBase= 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杂交种所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)