SQLAlchemy中两次调用fetchall()取长度结果不同,原因何在?
为什么两次
len()结果不一样? 这是个非常典型的SQLAlchemy新手问题,我来给你拆解清楚:
核心原因:fetchall()会消耗结果集游标
SQLAlchemy的Result对象(也就是你代码里的SQLAlchemyResult)本质是一个游标式的结果集——它就像一个指针,一开始指向结果的开头。当你调用fetchall()时,它会一次性把指针之后所有的结果都取出来,同时把指针移到结果集的末尾。这时候再调用fetchall(),因为指针后面已经没有数据了,就只能返回空列表[],自然len([])就是0。
对应你的代码分析
- 第一次执行
print(len(SQLAlchemyResult.fetchall())):fetchall()取出了所有1条结果,len()计算得1,所以打印出1。 - 紧接着执行
w=len(SQLAlchemyResult.fetchall()):这时候结果集的指针已经在末尾了,fetchall()返回空列表,len()得到0,所以w的值是0,打印出0。
解决方案
最稳妥的做法是先把结果集存到变量里,再重复使用:
# 先一次性取出所有结果并保存 results = SQLAlchemyResult.fetchall() print(len(results)) # 输出1 w = len(results) print(w) # 输出1
如果你用的是SQLAlchemy 1.4及以上版本,更推荐用Result.all()方法——它会返回一个缓存后的列表,多次调用也不会再去数据库拉取数据,用法和上面一致:
results = SQLAlchemyResult.all() print(len(results)) w = len(results) print(w)
内容的提问来源于stack exchange,提问作者user3690132
相关产品推荐
相关产品推荐

