【问题标题】:How to get last record如何获取最后一条记录
【发布时间】:2012-01-23 00:42:43
【问题描述】:

我需要从 db 获取最后一条记录。我正在使用 sqlalchemy。 目前,我正在这样做:

obj = ObjectRes.query.all()
return str(obj[-1].id)

但是查询太重了。我怎样才能更好地获得最后的记录?

【问题讨论】:

    标签: python sqlalchemy flask


    【解决方案1】:

    如果需要,不要忘记禁用现有的排序

    就我而言,我有动态的有序关系:

    class Match:
      ...
      records = relationship("Record", backref="match", lazy="dynamic", order_by="Record.id")
    

    当我尝试接受的答案时,我得到了第一条记录,而不是最后一条,因为 ORDER BY 被应用了两次并破坏了结果。

    根据documentation

    所有现有的 ORDER BY 设置都可以通过传递 None 来抑制

    所以解决办法是:

    match = db_session.query(Match).first()
    last_record = match.records.order_by(None).order_by(Record.id.desc()).first()
    

    【讨论】:

      【解决方案2】:

      有时很难重新表述简单的事情:

      SELECT * FROM ObjectRes WHERE id IN (SELECT MAX(id) FROM ObjectRes)
      

      但这对我有用:

      session.query(ObjectRes).filter(ObjectRes.id == session.query(func.max(ObjectRes.id)))
      

      【讨论】:

        【解决方案3】:

        看看Query.first()。如果您在右栏中指定sort,则第一个将是您的最后一个。一个示例可能如下所示:

        obj = session.query(ObjectRes).order_by(ObjectRes.id.desc()).first()
        

        【讨论】:

        • 谢谢! ObjectRes.query.order_by('-id').first()
        • @dimazubrik 我收到警告使用它SAWarning: Can't resolve label reference '-id'; converting to text() (this warning may be suppressed after 10 occurrences)
        • ^ 这现在变成了一个错误;我使用Model.query.order_by(-Model.field_name).first() 来检索所需的对象
        • 这实际上是返回查询的所有值,然后只弹出第一个值(即超级低效),还是它足够聪明,实际上可以在引擎盖下使用 ORDER BY desc LIMIT 1 之类的东西?
        猜你喜欢
        • 1970-01-01
        • 2012-04-11
        • 2015-01-29
        • 2023-03-16
        • 2012-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多