SQLAlchemy获取自某个值以来的最后一行



我正在寻找一种方法来获取自上次向数据库添加某个值以来的所有行。例如:

+--------+--------+--------+ 
| created| status |   my_id|
+--------+--------+--------+
| ...    | success|       3|
| ...    | fail   |       3|
| ....   | success|       3|
| ....   | fail   |       3|
| ....   | fail   |       3|
+--------|--------+--------+

给定下表,我的查询将提取最后两行,例如";给我自上次看到成功状态以来的最后一行";

角落案例:如果没有成功案例,那么应该返回所有行。如果最后一行成功,则返回nothing或None或其他内容。

我不知道从哪里开始。。我不能按日期订购,因为那样会把订购搞砸。在一个查询中执行此操作将是最优雅的,类似于

#Get the last success ?
subq = (db.session.query(MyObject.status, MyObject.created, MyObject.my_id).group_by(my_id).filter_by(status=="success").order_by(created.desc)
.subquery())
(db.session.query(MyObject).join(
subq, #Last success
and_(MyObject.created >= sub.c.created)
).filter_by(status=="fail").all())

编辑:创建的格式如下:created = Column(types.DateTime, nullable=False, default=datetime.utcnow)

以下是数据库表中显示一些值的摘录:

id  created             status  my_id
1   2020-11-26 16:09:03 failed  3
2   2020-11-26 16:12:03 failed  3
3   2020-11-26 16:15:03 failed  3
4   2020-11-26 16:18:04 failed  3
5   2020-11-26 16:21:04 failed  3
6   2020-11-26 16:24:04 failed  3
7   2020-11-26 16:27:04 failed  3
8   2020-11-26 16:30:05 failed  3
9   2020-11-26 16:33:00 failed  3
10  2020-11-26 16:36:00 failed  3
11  2020-11-26 16:39:01 failed  3
12  2020-11-26 16:42:01 failed  3
13  2020-11-26 16:45:01 failed  3
14  2020-11-26 16:48:01 failed  3
15  2020-11-26 16:51:02 failed  3
16  2020-11-26 16:54:02 failed  3
17  2020-11-26 16:57:02 failed  3
18  2020-11-26 17:00:08 failed  3

第2版:

我已经处理了一个查询,以确定何时在某个地方取得了成功:

subq = db.session.query(MyObj).filter_by(status="success", my_id=3). order_by (MyObj.id.desc()).limit(1).subquery("t2"))
q = MyObj.query.join(subq, and_(MyObj.status=="failed", MyObj.id > subq.c.id)).all()

这并不能解决";所有都是失败的";然而

我认为这样的东西应该能在中工作

subq = (session.query(sa.func.coalesce(sa.func.max(MyObject.created), dt.datetime.min))
.filter_by(status='success').scalar())
q = (session.query(MyObject)
.filter(MyObject.created >= subq)
.filter(MyObject.status == 'failed'))

在子查询中,我们返回最大的";成功;日期使用CCD_ 2。如果没有一个";成功;则CCD_ 3提供CCD_。我们返回一个scalar,以便在过滤器中比较该值。

最新更新