web-dev-qa-db-ja.com

mysqlカーソルとイテレータについて

Mysqlカーソルとデータを読み取ったと想像してください。データ量が非常に多いので、毎回1行処理したいと思います。

簡単で簡単な方法は次のようになります。

_while True:
    row = cursor.fetchone()
    if not row: break
    .....
_

しかし、これは見栄えがよくないので、この方法が想像どおりに機能するかどうか疑問に思います。

_for row in iter(cursor.fetchall())
_

私が知りたいのは、iter(cursor.fetchall())の方法を使用する場合、最初にすべてのデータをフェッチするのか、それとも一度に1行だけをフェッチするのかということです。

どんなアイデアでも大歓迎です。

どうも

23
taijirobot2

MySQLdbカーソルクラスは イテレータプロトコル を実装しているため、次のように簡単に実行できます。

cursor.execute(sql)
for row in cursor:
    print row
    ...

MySQLdb.cursors.BaseCursor からの関連コード:

def __iter__(self):
    return iter(self.fetchone, None)
48
samplebias