使用SQLAlchemy按照ID顺序获取最后几条插入的记录

5

我有一个表格,想要按照它们添加到数据库的时间顺序获取最后3个记录。 我有以下内容:

session.query(User).order_by(User.id.desc()).limit(3)

这个代码从数据库中获取了最后3条记录,但是由于我按照ID降序排列,它们的顺序是相反的。我想要按照正常的顺序获取记录,但是使用多个排序查询似乎行不通。

有什么解决办法或者变通方法吗?谢谢。


reversed(session.query(User).order_by(User.id.desc()).limit(3)) 会返回最近添加的三个用户,按照 id 逆序排列。 - Gerrat
@Gerrat 刚刚尝试了一下,出现了一个错误,指出查询没有 len()。 - Pav Sidhu
2个回答

7

除了使用子查询执行您想要的第二个 order by 来生成SQL之外,我看不到任何其他方法,建议参考此答案:Get another order after limit with mysql

我相信,在SQLAlchemy中你需要像这样做:

session.query(session.query(User).order_by(User.id.desc()).limit(3)\
.subquery().alias('sUser')).order_by('sUser.id')

这是未经测试的代码,我相信你最终会得到一系列KeyedTuple对象,而不是User类的实例,尽管可能有一种方法可以解决这个问题。

然而,既然你正在使用ORM,如果可以用Python完成,我认为在SQLAlchemy子查询中进行这样的操作并没有什么意义。像这样:

reversed(session.query(User).order_by(User.id.desc()).limit(3).all())

如果您需要列表而不是反向迭代器,则可以使用以下代码:

或者是这样的:

session.query(User).order_by(User.id.desc()).limit(3).all()[::-1]

0

事实上,我有一个类似的问题,但当我看到你写的命令时,我意识到我需要做什么,然后它起作用了, 那么: 首先感谢 其次,我认为您需要实现以下命令:

desc3user = User.query.order_by(User.id.desc()).limit(3)

1
你能否详细解释一下这个命令是如何回答这个问题的?这将极大地改善答案! - Sasha Kondrashov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接