【发布时间】:2015-05-23 13:53:51
【问题描述】:
SQLAlchemy 中one 和first 方法有什么区别
【问题讨论】:
标签: python sqlalchemy flask-sqlalchemy
SQLAlchemy 中one 和first 方法有什么区别
【问题讨论】:
标签: python sqlalchemy flask-sqlalchemy
Query.one() 要求结果集中只有一个个结果;如果数据库返回 0 个或 2 个或更多结果,则会引发异常。
Query.first() 返回可能更大的结果集中的第一个(将LIMIT 1 添加到查询中),如果没有结果,则返回None。不会引发异常。
来自Query.one() 的文档:
只返回一个结果或引发异常。
如果结果不包含任何行,则返回此查询的第一个结果或无。
(强调我的)。
就 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 可能会在查询中使用LIMIT 而one 不会,这可能意味着first 会导致连接子查询,而one 不会。这可能是使用one 的一个非常相关的原因。
first() 切片,它会自动转换为 LIMIT。链接的文档明确指出使用了LIMIT。
.one() 是检查记录是否像 Halvor Holsten Strand 建议的那样简单存在的最有效/最具成本效益的方法吗?因为在阅读 .one()、.first() 和 .one_or_none() 的文档时,它们都声明“调用 [该方法] 会导致执行底层查询。”,所以这让我相信它们本质上是等价的性能方面,这似乎表明它们都不可避免地执行查询(假设是连接)。