【问题标题】:Get first AND last element with SQLAlchemy使用 SQLAlchemy 获取第一个和最后一个元素
【发布时间】:2014-12-19 03:12:18
【问题描述】:

在我的 Python (Flask) 代码中,我需要从 SQLAlchemy 查询中获取按给定变量排序的第一个元素和最后一个元素。

我先写了以下代码:

first_valuation = Valuation.query.filter_by(..).order_by(sqlalchemy.desc(Valuation.date)).first()
# Do some things
last_valuation = Valuation.query.filter_by(..).order_by(sqlalchemy.asc(Valuation.date)).first()
# Do other things

由于这些查询对于 PostgreSQL 数据库来说可能很繁重,而且我正在复制我的代码,我认为只使用一个请求会更好,但我对 SQLAlchemy 的了解还不够多…… (例如,当查询被有效触发时?)

这个问题的最佳解决方案是什么?

【问题讨论】:

    标签: python database postgresql sqlalchemy flask-sqlalchemy


    【解决方案1】:

    1) How to get First and Last record from a sql query? 这是关于如何在一个查询中获取第一条和最后一条记录。

    2) Here 是关于 sqlalchemy 查询的文档。特别注意union_all(执行上面的答案)。 它还包含有关何时触发查询的信息(基本上,当您使用返回结果的方法时会触发查询,例如 first() 或 all()。这意味着,Valuation.query.filter_by(..).order_by(sqlalchemy.desc(Valuation.date)) 不会向数据库发出查询)。

    另外,如果内存不是问题,我会说从您的第一个查询中获取 all() 对象,然后通过 python 获取第一个和最后一个结果:

    results = Valuation.query.filter_by(..).order_by(sqlalchemy.desc(Valuation.date)).all()
    first_valuation = results[0]
    last_valuation = results[-1]
    

    这将比执行两个(甚至是统一的)查询更快,但如果您的数据库足够大,可能会占用大量内存。

    【讨论】:

    • 目前,一个请求意味着大约 15000 个结果,但我会使用第二个,直到出现性能问题!
    • 是的,我会使用两个查询,因为它会大大减少您的数据库负载。当你想要两个时,无需从数据库中提取所有这 14998 个对象。
    【解决方案2】:

    没有必要把过程弄得这么复杂。

    first_valuation = Valuation.query.filter_by(..).order_by(sqlalchemy.desc(Valuation.date)).first()
    # Do some things
    last_valuation = Valuation.query.filter_by(..).order_by(sqlalchemy.asc(Valuation.date)).first()
    

    这就是你所拥有的,而且已经足够好了。对于任何数据库来说它都不重。如果你觉得它变得太重,那么你总是可以使用一些索引。

    不要尝试使用all() 获取所有结果并以list 样式从中检索。 当您这样做时,all() 会将所有内容加载到内存中,如果您有很多结果,这将非常非常糟糕。最好只执行两个查询来获取这些项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 2018-02-22
      • 2012-04-21
      • 2018-12-29
      • 2015-12-04
      • 2015-11-12
      • 2016-06-05
      相关资源
      最近更新 更多