#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.