【问题标题】:Get last few records put in table in order of ID with SQLAlchemy使用 SQLAlchemy 获取按 ID 顺序放入表中的最后几条记录
【发布时间】:2016-02-14 10:35:12
【问题描述】:

我有一个表,我想从其中按添加到数据库的时间顺序获取最后 3 条记录。我有以下内容:

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

这会从数据库中获取最后 3 条记录,但是如果我降低了 ID,它们的顺序是倒序的。我想按顺序排列记录,但是使用多个顺序查询似乎不起作用。

有解决方法或解决方案吗?谢谢。

【问题讨论】:

  • reversed(session.query(User).order_by(User.id.desc()).limit(3)) ?
  • @Gerrat 刚试了一下,收到一个错误,指出查询没有 len()。

标签: python database sqlalchemy flask-sqlalchemy


【解决方案1】:

除了使用子查询来执行您想要的第二个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 执行此操作,我认为在 SQL 级别使用 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]

【讨论】:

    【解决方案2】:

    事实上,我也有类似的问题,但是当我看到你如何编写命令时,我意识到我需要做什么并且它有效, 然后: 首先感谢 第二件事我认为你需要实现以下命令:

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

    【讨论】:

      猜你喜欢
      • 2012-01-25
      • 2012-09-02
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多