gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:39:47 26 4
gpt4 key购买 nike

我需要一点帮助来用 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_valuations 中获取属性值,其中的列(zip_code INT,valuation DECIMAL,as_if DATE)最接近表 中的销售日期销售。我知道如何重写它,但我完全坚持使用 order_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_)

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

最佳答案

How to combine these queries together?

使用as_scalar() , 或 label() :

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)

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

but I completely stuck on order_by expression - I cannot prepare subquery to pass ordering member later.

后面就不用传了。您当前声明子查询的方式很好,因为 SQLAlchemy 可以 automatically correlate FROM objects to those of an enclosing query .我尝试创建在某种程度上代表你所拥有的模型,下面是上面的查询是如何计算的(添加了换行符和缩进以提高可读性):

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

关于python - 如何将 SQL 标量子查询转换为 SQLAlchemy 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37392773/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com