我有这个问题,我不明白。
我有SELECT()
查询返回数千行。对于内存问题,我让它一次返回一个结果行。然后我将结果转换为字典。
select_query = select([table1,table2]).where(all_filters)
res = conn.execute(select_query)
row = res.fetchone()
while row is not None:
row = res.fetchone()
print row is None
结果是:
False
False
False
False
True
为什么它仍然显示为真,即使它应该在row is None
??
所以稍后当我想使用:row = dict(zip(row.keys(), row))
创建一个字典时
我收到错误:AttributeError: 'NoneType' object has no attribute 'keys'
我是Python的新手,任何帮助都会受到赞赏。
答案 0 :(得分:1)
这不是特定于Python的,而是任何语言中while
循环的属性。我假设你正在处理循环内的行,所以请考虑这个:
row = res.fetchone()
while row is not None:
row = res.fetchone()
print row is None
processRow(row)
在上一次迭代中,res.fetchone()
返回None
,然后将其分配给row
,后者变为None
。然后,在processRow
条件被检查之前执行while
语句,因此它评估processRow(None)
。只有在之后,在接下来的迭代中,row is not None
条件为假,循环终止。这段代码没有任何问题,它正是它的工作方式。
一种可能的解决方案是在循环内部处理之前检查None
:
while True:
row = res.fetchone()
if row is None:
break
processRow(row)
或者,如果查询集很小,您甚至可以全部获取它们并使用:
进行处理for row in res.fetchall():
processRow(row)