使用SQLAlchemy,'fetchone()'和'LIMIT 1'之间有区别吗?

6
使用SQLAlchemy从数据库检索行时,可能会使用:
query = "SELECT some_col FROM some_table"

row = session.execute(query).fetchone()

然而,您也可以这样做:

query = "SELECT some_col FROM some_table LIMIT 1"

row = session.execute(query).fetchall()

有没有什么理由偏好其中之一,例如更好的性能?


4
在第二种情况下,数据库引擎预先知道只需要一行数据,并且不必为快速提供更多数据做准备(如果那时候不需要的话)。 - Michael Butscher
3
此外,如果您知道只会获取一个项目,那么如果您在 LIMIT 1 的情况下调用 .fetchall(),则会返回一个仅包含单个元素的集合,您需要索引或迭代才能使用。最好使用限制查询和 .fetchone(),这样您就可以立即返回单个行。 - SuperShoot
1个回答

2
第一个变体适用于所有数据库管理系统,而第二个变体仅适用于支持LIMIT关键字的数据库管理系统,这不是标准的。因此,如果您想要告诉数据库将结果限制为仅一个行,则最好使用SQLAlchemy核心而不是作为字符串的SQL语句。类似于:
row = session.execute(select([some_table.c.some_col]).limit(1)).fetchone()

如果您只查询一个行和一个列,可以考虑使用 scalar() 而不是 fetchone():
value = session.execute(select([some_table.c.some_col]).limit(1)).scalar()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接