mysqldb извлекает весь результат запроса в один кусок всегда, даже если я просто делаю fetchone? - PullRequest
5 голосов
/ 15 января 2010

Так что если я сделаю

 import MySQLdb
 conn = MySQLdb.connect(...)
 cur = conn.cursor()
 cur.execute("SELECT * FROM HUGE_TABLE")
 print "hello?"
 print cur.fetchone() 

Мне кажется, что MySQLdb получает всю огромную таблицу до того, как попадает в "печать". Ранее я предполагал, что в фоновом режиме выполняется своего рода «ленивое извлечение курсора / состояния», но это не похоже на это для меня. Это правильно? Если так, то это потому, что так должно быть или это связано с ограничением проводного протокола MySQL? Означает ли это, что Java / Hibernate ведут себя так же?

Я думаю, мне нужно использовать предложения MySQL "limit 1" и родственников, если я хочу пройти через большой стол, не потянув за все это сразу? Или нет? Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 15 января 2010

В модуле _mysql используйте следующий вызов:

conn.use_result()

Это говорит соединению, что вы хотите извлекать строки одну за другой, оставляя остаток на сервере (но оставляя курсор открытым).

Альтернатива (и значение по умолчанию):

conn.store_result()

Это говорит соединению о необходимости извлечь весь набор результатов после выполнения запроса, а последующие выборки будут просто перебирать набор результатов, который теперь находится в памяти в вашем приложении Python. Если ваш набор результатов очень большой, вам следует рассмотреть возможность использования LIMIT, чтобы ограничить его тем, с чем вы можете справиться.

Обратите внимание, что MySQL не разрешает запуск другого запроса, пока вы не получите все строки из той, которую вы оставили открытой.

В модуле MySQLdb эквивалентно использование одного из этих двух различных объектов курсора из MySQLdb.cusrors:

  • CursorUseResultMixIn
  • CursorStoreResultMixIn
0 голосов
/ 15 января 2010

oursql - это альтернативный интерфейс MySQL DB-API, который предоставляет несколько дополнительных сведений более низкого уровня, а также предоставляет другие средства для работы с большими наборами данных.

0 голосов
/ 15 января 2010

Это верно для любого другого языка, который я использовал. Fetchone просто собирается извлечь только первую строку набора результатов, которая в данном случае является всей базой данных. Это более удобный метод, чем что-либо другое, он разработан так, чтобы его было проще использовать, если вы ЗНАЕТЕ, что сработает только один результат, или вы заботитесь только о первом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...