0

私には理解できないこの問題があります。

SELECT()千もの行を返すクエリがあります。メモリの問題については、一度に 1 つの結果行を返すようにしました。次に、結果を辞書に変換します。

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

停止する必要がある場合でも、なぜ true と表示されるのですrow is Noneか??

後で、次を使用してdictを作成したい場合: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される前にステートメントが実行されるため、 と評価されます。の後でのみ、次の反復中に条件が false になり、ループが終了します。このコードに問題はありません。まさにこのコードが意図した通りに機能します。whileprocessRow(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 に答える