【问题标题】:What is the difference between .one() and .first().one() 和 .first() 有什么区别
【发布时间】:2015-05-23 13:53:51
【问题描述】:

SQLAlchemy 中onefirst 方法有什么区别

【问题讨论】:

    标签: python sqlalchemy flask-sqlalchemy


    【解决方案1】:

    Query.one() 要求结果集中只有一个个结果;如果数据库返回 0 个或 2 个或更多结果,则会引发异常。

    Query.first() 返回可能更大的结果集中的第一个(将LIMIT 1 添加到查询中),如果没有结果,则返回None。不会引发异常。

    来自Query.one() 的文档:

    只返回一个结果或引发异常。

    来自Query.first()

    如果结果不包含任何行,则返回此查询的第一个结果或无

    (强调我的)。

    就 Python 列表而言,one() 将是:

    def one(lst):
        if not lst:
            raise NoResultFound
        if len(lst) > 1:
            raise MultipleResultsFound
        return lst[0]
    

    first() 将是:

    def first(lst):
        return lst[0] if lst else None
    

    还有一个Query.one_or_none() 方法,仅当查询有多个结果时才会引发异常。否则它将返回单个结果,如果没有结果,则返回 None

    在列表中,这相当于:

    def one_or_none(lst):
        if not lst:
            return None
        if len(lst) > 1:
            raise MultipleResultsFound
        return lst[0]
    

    【讨论】:

    • 我认为first 可能会在查询中使用LIMITone 不会,这可能意味着first 会导致连接子查询,而one 不会。这可能是使用one 的一个非常相关的原因。
    • @HalvorHolstenStrand 是的,first() 切片,它会自动转换为 LIMIT。链接的文档明确指出使用了LIMIT
    • @MartijnPieters 可以肯定地说.one() 是检查记录是否像 Halvor Holsten Strand 建议的那样简单存在的最有效/最具成本效益的方法吗?因为在阅读 .one().first().one_or_none() 的文档时,它们都声明“调用 [该方法] 会导致执行底层查询。”,所以这让我相信它们本质上是等价的性能方面,这似乎表明它们都不可避免地执行查询(假设是连接)。
    猜你喜欢
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    相关资源
    最近更新 更多