2

これらの 2 つの Python コード スニペットを参照してください。

conn = MySQLdb.connect(c['host'], c['user'], c['password'], c['db'])
cur = conn.cursor()
cur.execute("select * from geo_weathers;)   ->  **1147L**

conn = MySQLdb.connect(c['host'], c['user'], c['password'], c['db'], cursorclass=MySQLdb.cursors.SSCursor)
cur = conn.cursor()
cur.execute("select * from geo_weathers")   ->  **18446744073709551615L**

上記の 2 つのケースで返される行数が異なるのはなぜですか? 参考までに、テーブルには 1147 行あります。

SSCursor は、サーバー側で結果を保存するために使用されます。それが理由ですか?この選択クエリの影響を受けるすべての行は?

誰か知っていますか ?

4

1 に答える 1

3

MySQLdb で使用される標準のカーソルは、ストアド リザルト カーソルです。これは、結果セット全体がサーバーから転送され、execute()呼び出しの結果としてクライアントのメモリにキャッシュされることを意味します。

ASSCursorはサーバー側のカーソルであり、要求されたときにのみ結果をクライアントに返します。

カーソルexecute()呼び出しは、MySql C API 関数mysql_affected_rows()の結果を返します。これは、クエリの mysql_num_rows() の結果を返しますSELECT

結果はサーバー側に保存されるため、クライアントは、結果を反復処理するまで、影響を受けた行の数を知りません。

のドキュメントにmysql_num_rows()は次のように書かれています。

mysql_num_rows() の使用は、結果セットを返すために mysql_store_result() または mysql_use_result() のどちらを使用するかによって異なります。mysql_store_result() を使用すると、mysql_num_rows() がすぐに呼び出される場合があります。mysql_use_result() を使用すると、結果セット内のすべての行が取得されるまで、mysql_num_rows() は正しい値を返しません。

行数のカウントを取得する場合は、呼び出しSELECT COUNT(*) from geo_weathersの結果に依存するのではなく、使用してください。execute()

于 2013-01-29T00:48:07.317 に答える