0

我有这个问题,我不明白。

我有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 新手,任何帮助将不胜感激。

4

1 回答 1

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)
于 2013-10-18T11:31:41.290 回答