Подтвердить что ты не робот

Как эффективно использовать SQLDB SScursor?

Мне приходится иметь дело с большим набором результатов (может быть сотни тысяч строк, а иногда и больше).
К сожалению, их нужно искать сразу (при запуске).

Я пытаюсь сделать это, используя как можно меньше памяти.
Посмотрев на SO, я обнаружил, что использование SSCursor может быть тем, что я ищу, но я до сих пор не знаю, как точно их использовать.

Выполняет fetchall() из базового курсора или SS-курсора то же самое (с точки зрения использования памяти)?
Могу ли я "потопить" из sscursor мои строки один за другим (или несколько на несколько), и если да, то что это лучший способ сделать это?

4b9b3361

Ответ 1

Я согласен с ответом Отто Allmendinger, но для того, чтобы сделать явный комментарий Дениса Откидаха, вот как вы можете перебирать результаты без использования функции Otto fetch():

import MySQLdb.cursors
connection=MySQLdb.connect(
    host="thehost",user="theuser",
    passwd="thepassword",db="thedb",
    cursorclass = MySQLdb.cursors.SSCursor)
cursor=connection.cursor()
cursor.execute(query)
for row in cursor:
    print(row)

Ответ 2

Определенно использовать SSCursor при наборе больших наборов результатов. Для меня это имело огромное значение, когда у меня была аналогичная проблема. Вы можете использовать его следующим образом:

import MySQLdb
import MySQLdb.cursors

connection = MySQLdb.connect(
        host=host, port=port, user=username, passwd=password, db=database, 
        cursorclass=MySQLdb.cursors.SSCursor) # put the cursorclass here
cursor = connection.cursor()

Теперь вы можете выполнить свой запрос с помощью cursor.execute() и использовать курсор в качестве итератора.

Изменить: удалил ненужный иротерам, который был зарожден, спасибо Denis!

Ответ 3

В качестве альтернативы вы можете использовать SSCursor вне объекта подключения (это очень важно, если вы уже определили соединение и не хотите, чтобы все подключение использовало SSCursor как класс cursorclass).

import MySQLdb
from MySQLdb.cursors import SSCursor # or you can use SSDictCursor

connection = MySQLdb.connect(
        host=host, port=port, user=username, passwd=password, db=database)
cursor = SSCursor(connection)
cursor.execute(query)
for row in cursor:
    print(row)