如何从函数中查询并获取最大值

时间:2019-04-13 12:14:14

标签: python postgresql sqlalchemy

我想进行一个查询,该查询将获得一条具有最低度量标准的记录,并根据模型的字段进行计算:view,unique_views和一些其他参数,该参数对于查询是恒定的。

我的猜测是要使用

session.query(func.min(get_metric(Post.views, Post.unique_views, 6))).first()

但是我明白了

Traceback (most recent call last):
  File "/home/john/PycharmProjects/posts/testing.py", line 32, in <module>
    session.query(func.min(get_metric(Post.views, Post.unique_views, 6))).first()
  File "/home/john/PycharmProjects/posts/testing.py", line 19, in get_metric
    metric = radians(views) + cos(unique_views) + asin(weight)
TypeError: must be real number, not InstrumentedAttribute

型号

class Post(db.Model):
    __tablename__ = 'posts'

    id = Column(Integer, primary_key=True)
    name = Column(String(20), unique=True, nullable=False)
    views = Column(Integer, nullable=False)
    unique_views = Column(Integer, nullable=False)

功能

def get_metric(views, unique_views, weight):
    metric = radians(views) + cos(unique_views) + asin(weight)
    return metric

我想念什么?

1 个答案:

答案 0 :(得分:2)

问题在于,Python的数学函数使用数字,而不是SQLAlchemy构造。为了生成SQL表达式,您需要使用func创建SQL函数表达式。您可以通过修改现有函数来使用它,以接受用于数学的命名空间作为参数:

import math

def get_metric(views, unique_views, weight, math=math):
    metric = math.radians(views) + math.cos(unique_views) + math.asin(weight)
    return metric

现在,当您想生成SQL时,将func作为数学值传递:

session.query(func.min(get_metric(Post.views, Post.unique_views, 6, math=func))).first()