Возвращает итератор с помощью pyodbc на python

#python-3.x #pyodbc

#python-3.x #pyodbc

Вопрос:

Я пытаюсь написать DataAccessLayer с помощью python. Одна из функций должна возвращать итератор для большого набора строк (я не хочу извлекать все и потреблять много памяти).

Итератор будет использоваться в другом классе, который использует мой класс DAL для проверки чего-либо для каждого пользователя.

Я понимаю, что я не должен возвращать сам курсор, но как я могу предоставить другому классу итератор?

МОЙ DAL:

 import src.data_handler.data_handler_conf as conf
import time
import pyodbc


class DataHandler:

def __init__(self):
    # Get configuration
    self.db_url = conf.DB_URL
    self.db_name = conf.DB_NAME
    self.db_username = conf.DB_USERNMAE
    self.db_password = conf.DB_PASSWORD

    self.db_conn = None
    self.connect()

def connect(self):
    self.db_conn = pyodbc.connect("DRIVER={FreeTDS}"
                                  ";SERVER="   self.db_url  
                                  ";DATABASE="   self.db_name  
                                  ";UID="   self.db_username  
                                  ";PWD="   self.db_password)
    self.db_conn.setencoding(encoding='utf-8')

def check_users(self):
    cursor = self.db_conn.cursor()
    cursor.execute("select user_name, field1 from users")

    # What should i return?!
    return cursor
  

Ответ №1:

Я подозреваю, что вы должны иметь возможность использовать генератор, что-то вроде этого:

 def get_results(cnxn):
    crsr = cnxn.cursor()
    crsr.execute("SELECT * FROM MillionRows")
    row = crsr.fetchone()
    while row:
        yield row
        row = crsr.fetchone()
  

Он вернет последовательность объектов-строк pyodbc.