Python 原始SQL到Sqlalchemy混合表达式

Python 原始SQL到Sqlalchemy混合表达式,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,我需要将它转换为sqla core postgres查询,该查询通过不同的因子和表计算分数。我把分数作为一个聚合值,但我更喜欢它是无状态的,因此我试图将它定义为一个混合属性和一个表达式。混合属性很简单,用python和voila做了一些简单的数学运算和条件 如果不使用sqlalchemy核心表达式,只使用原始SQL,是否有机会实现这一点?如果是的话,这对于将来的操作也很好,因为它是原始的,不是动态的,SQL查询比使用sqla核心函数更容易编写。如果没有,我希望您能为我指出正确的方向,只声明wit

我需要将它转换为sqla core postgres查询,该查询通过不同的因子和表计算分数。我把分数作为一个聚合值,但我更喜欢它是无状态的,因此我试图将它定义为一个混合属性和一个表达式。混合属性很简单,用python和voila做了一些简单的数学运算和条件

如果不使用sqlalchemy核心表达式,只使用原始SQL,是否有机会实现这一点?如果是的话,这对于将来的操作也很好,因为它是原始的,不是动态的,SQL查询比使用sqla核心函数更容易编写。如果没有,我希望您能为我指出正确的方向,只声明with子句,而不使用sqla核心语言中的内部子查询

我尝试使用下面的表达式,但它抛出了错误:

@分数 def评分CLS: raw=textcalc\u score\u raw\q下面的sql查询 raw.bindparamsproduct_id=cls.id 返回db.session.queryProductModel.from_statementraw.scalar 还直接从引擎执行查询 db.engine.executeraw,但最终还是出现了相同的错误

错误

看起来,混合表达式的cls.id是一个插入指令的属性,因此它不提供任何值

SQL查询:

以gdp为基础 选择 SUMdu+de+sc+1作为gdp 从…起 选择 说明不为空时的情况 0.5 其他的 0 以de结尾, 如果持续时间不为空,则为 0.5 其他的 0 以杜结尾,, 运输成本不为空时的情况 2 其他的 0 以sc结尾 从…起 产品 哪里 id=:产品的id作为 , td AS 选择 将*计算为td 从…起 产品认证学位 哪里 产品标识=:产品标识 选择 总和
当td我通过通读SQLA的核心文档来解决这个问题时。代码很麻烦,但它可以工作。我复制了与原始帖子完全相同的原始SQL查询

@分数 def评分CLS: 案例条款 desc=案例[ ProductModel.description!=无,0.5, ],否则=0。标签为'desc' 船费=箱费[ ProductModel.shipping_成本!=无,2, ],否则=0。标签为“装运” dur=病例[ ProductModel.duration!=无,0.5 ],否则=0。标签为'dur' ibp=项目主体点,选择案例。。。作为一个 ibp_q=选择[描述、装运成本、dur]\ .whereProductModel.id==cls.id.alias ibp_q=选择[函数和 ibp_q.c.desc+ibp_q.c.dur+ibp_q.c.ship_c+1 .标注“gdp”]。cte“属性积分” 总度数,选择计数*作为td。。。 td_q=选择[func.countproduct_degrees.c.deal_id.label'total']。其中product_degrees.c.deal_id==cls.id.cte'total_degrees'cte在with子句中创建别名 总分逻辑,td时选择总和案例
sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) A value is required for bind parameter 'product_id'