我想进行一个查询,该查询将获得一条具有最低度量标准的记录,并根据模型的字段进行计算: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
我想念什么?
答案 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()