python - 如何使用 max(date) 和 SQLAlchemy 选择最新的对象
问题描述
正如我在回答中提到的,这是错误的方法。
我的声明:
db.session.query(
m.SiteServicePrice, func.max(m.SiteServicePrice.created).label('latest')).filter(
m.SiteServicePrice.site_id == 2001).group_by(m.SiteServicePrice.service_id).all()
我想取回 m.SiteServicePrice 对象列表,而不是元组列表。
这个:
[<SiteServicePrice(site_id:2001 service_id:12 created:2019-01-30 03:25:31)>,
<SiteServicePrice(site_id:2001 service_id:21 created:2019-01-30 03:25:31)>,
<SiteServicePrice(site_id:2001 service_id:37 created:2019-01-30 03:25:31)>]
而不是这个:
[(<SiteServicePrice(site_id:2001 service_id:12 created:2019-01-30 03:25:31)>, datetime.datetime(2020, 5, 28, 22, 31, 35)),
(<SiteServicePrice(site_id:2001 service_id:21 created:2019-01-30 03:25:31)>, datetime.datetime(2020, 5, 28, 22, 31, 54)),
(<SiteServicePrice(site_id:2001 service_id:37 created:2019-01-30 03:25:31)>, datetime.datetime(2020, 5, 28, 22, 32, 15)))]
有没有办法将其保留func.max(m.SiteServicePrice.created)
为查询的一部分,并指示 SQLAlchemy 不要将其包含在结果中?
我知道我可以使用列表理解或其他方式从结果中提取 m.SiteServicePrice 对象,但我很好奇是否有办法使用 SQLAlchemy 来做到这一点。
解决方案
原来我原来的 SQL 查询和 SQLAlchemy 语句不正确。
原始sql查询:
select
max(created),
created,
service_id, c_price, s_price
from
site_service_prices
where
site_id = 2001
group by service_id;
在这里,我不包括select
in 中的所有键group by
。MySQL 和 MariaDB 不会将此视为错误,它确实如此。MariaDB 知识库的解释
要latest
使用 max(date_field) 从查询中获取项目列表,需要子查询。
这是正确的查询:
1 SELECT
2 id, site_id, service_id, created
3 FROM
4 site_service_prices join(
5 SELECT
6 site_id, service_id, max(created) AS created
7 FROM
8 site_service_prices
9 WHERE
10 site_id = 1
11 GROUP BY
12 site_id, service_id
13 ) t2
14 USING (
15 site_id, service_id, created
16 );
这就是 SQLAlchemy 查询的样子:
# create a subquery with IDs and max date
sq = db.session.query(
m.SiteServicePrice.service_id.label('service_id'),
func.max(m.SiteServicePrice.created).label('created')).filter(
m.SiteServicePrice.site_id == 1).group_by(
m.SiteServicePrice.service_id).subquery()
# join with subquery
db.session.query(m.SiteServicePrice).join(sq,
and_(m.SiteServicePrice.service_id == sq.c.service_id,
m.SiteServicePrice.created == sq.c.created)).filter(
m.SiteServicePrice.site_id == 1).order_by(
m.SiteServicePrice.created.desc()).all()
推荐阅读
- c++ - 如何清理最小生成树
- java - CDI 在合格的 jaxrs 资源类中不起作用
- python - Python Pandas xlsxriter 堆积折线图类型设置Excel中的标准折线图
- java - 如何使用 Android KeyStore 确认密钥存储在 TEE(不是 SE)中?
- python - Linux或window都是一样的 :p -> HttpException('无效的HTTP请求形式(预期:权威或绝对,得到:相对)')
- jquery - 使用 ASP.NET Core 剃须刀页面从数据库中为 jQuery 数组动态分配值
- reactjs - 失败的道具类型:必须在容器上使用 Grid 的道具 justify
- android - 如何使用动画旋转图层列表中的项目?
- sql - SQL Server 代理作业不执行 SSIS 包权限错误
- python-3.x - Colab 中 CPU、GPU 和 TPU 使用的运行时间没有差异