Как эффективно использовать SQLDB SScursor?
Мне приходится иметь дело с большим набором результатов (может быть сотни тысяч строк, а иногда и больше).
К сожалению, их нужно искать сразу (при запуске).
Я пытаюсь сделать это, используя как можно меньше памяти.
Посмотрев на SO, я обнаружил, что использование SSCursor
может быть тем, что я ищу, но я до сих пор не знаю, как точно их использовать.
Выполняет fetchall()
из базового курсора или SS-курсора то же самое (с точки зрения использования памяти)?
Могу ли я "потопить" из sscursor мои строки один за другим (или несколько на несколько), и если да, то
что это лучший способ сделать это?
Ответы
Ответ 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)