Python 如何将SQL标量子查询转换为SQLAlchemy表达式

Python 如何将SQL标量子查询转换为SQLAlchemy表达式,python,mysql,sqlalchemy,Python,Mysql,Sqlalchemy,我需要一个简单的帮助来用SQLAlchemy语言表达我的代码,如下所示: SELECT s.agent_id, s.property_id, p.address_zip, ( SELECT v.valuation FROM property_valuations v WHERE v.zip_code = p.address_zip ORDER BY ABS(DATEDIFF(v.as_of, s.date_sold)

我需要一个简单的帮助来用SQLAlchemy语言表达我的代码,如下所示:

SELECT
    s.agent_id,
    s.property_id,
    p.address_zip,
    (
        SELECT v.valuation
        FROM property_valuations v WHERE v.zip_code = p.address_zip
        ORDER BY ABS(DATEDIFF(v.as_of, s.date_sold))
        LIMIT 1
    ) AS back_valuation,
FROM sales s
JOIN properties p ON s.property_id = p.id
内部子查询旨在从表
propert\u valuations
中获取与表
sales
中销售日期最接近的列(
zip\u code INT,valuation DECIMAL,as\u if DATE
)中的财产值。我知道如何重写它,但我完全停留在
order\u by
表达式上-我无法准备子查询以稍后传递给排序成员

目前我有以下疑问:

subquery = (
    session.query(PropertyValuation)
    .filter(PropertyValuation.zip_code == Property.address_zip)
    .order_by(func.abs(func.datediff(PropertyValuation.as_of, Sale.date_sold)))
    .limit(1)
)

query = session.query(Sale).join(Sale.property_)
如何将这些查询组合在一起

如何将这些查询组合在一起

使用,或:

使用
as_scalar()
将返回的列和行限制为1,因此无法使用它获取整个模型对象(因为
query(PropertyValuation)
PropertyValuation
的所有属性的选择),但只获取赋值属性是有效的

但我完全停留在order_by expression上——我无法准备子查询以便稍后传递ordering成员

以后没必要通过。您当前声明子查询的方式很好,因为SQLAlchemy可以。我尝试创建一些模型来表示您所拥有的,下面是上面查询的工作原理(添加了换行符和缩进以提高可读性):


“您目前在SQLAlchemy中有哪些内容?”TimMartin添加了主查询和子查询。
subquery = (
    session.query(PropertyValuation.valuation)
    .filter(PropertyValuation.zip_code == Property.address_zip)
    .order_by(func.abs(func.datediff(PropertyValuation.as_of, Sale.date_sold)))
    .limit(1)
)

query = session.query(Sale.agent_id,
                      Sale.property_id,
                      Property.address_zip,
                      # `subquery.as_scalar()` or
                      subquery.label('back_valuation'))\
        .join(Property)
In [10]: print(query)
SELECT sale.agent_id AS sale_agent_id,
       sale.property_id AS sale_property_id,
       property.address_zip AS property_address_zip,
       (SELECT property_valuations.valuation
        FROM property_valuations 
        WHERE property_valuations.zip_code = property.address_zip
        ORDER BY abs(datediff(property_valuations.as_of, sale.date_sold))
        LIMIT ? OFFSET ?) AS back_valuation 
FROM sale
JOIN property ON property.id = sale.property_id