Как эффективно использовать MySQLDB SScursor? - PullRequest
30 голосов
/ 27 ноября 2009

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

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

Делает ли fetchall() из базового курсора или курсора SS то же самое (с точки зрения использования памяти)?
Могу ли я «стримировать» со своих строк по очереди (или несколько на несколько) из sscursor и, если да,
Каков наилучший способ сделать это?

Ответы [ 3 ]

30 голосов
/ 27 ноября 2009

Я согласен с ответом Отто Алмендингера, но чтобы сделать явный комментарий Дениса Откидача, вот как вы можете перебирать результаты без использования функции 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)
10 голосов
/ 27 ноября 2009

Определенно используйте 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() и использовать курсор в качестве итератора.

Редактировать : удален ненужный доморощенный итератор, спасибо Денис!

0 голосов
/ 09 августа 2017

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

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)   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...