Невозможно выдать все строки в таблице в качестве ключа, значение с использованием sqlite3 - PullRequest
0 голосов
/ 29 марта 2019

По какой-то причине я не могу выполнить итерацию по всем строкам таблицы, если получаю результат из инструкции SELECT в sqlite3.Когда я возвращаю результат в виде списка, у меня есть все строки.

Я не уверен, что я делаю неправильно ...

Приведенный ниже код выдает только одну строку, если я использую его где-то снаружи:

def items(self):
        for row in self._cursor.execute('SELECT key, value FROM dict_table'):
            yield (self.loads(row[0]), self.loads(row[1]))

Если яобернуть возвращаемое в виде списка, я получаю все строки:

def iteritems(self):
        for row in self._cursor.execute('SELECT key, value FROM dict_table'):
            yield (self.loads(row[0]), self.loads(row[1]))


def items(self):
        return(list(self.iteritems()))

В идеале, я хочу использовать его только в качестве генератора, а не получить весь список

def items(self):
        for row in self._cursor.execute('SELECT key, value FROM dict_table'):
            yield (self.loads(row[0]), self.loads(row[1]))

Где-то еще вкод, я просто хочу иметь возможность запустить:


for key, val in self.items():
    print(val/key)

РЕДАКТИРОВАТЬ:

Я также попытался следующее решение без какого-либо успеха

def iteritems(self):
        for row in self._cursor.execute('SELECT key, value FROM dict_table'):
            yield (self.loads(row[0]), self.loads(row[1]))


def items(self):
        yield from (self.iteritems())

Это также до сих порвозвращает мне 1 строку, когда я пытаюсь перебрать элементы

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

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

Чтобы исправить это, вы должны создать новый курсор для каждого запроса.

0 голосов
/ 29 марта 2019

Это потому, что вы выбираете строки снова и снова.пожалуйста, попробуйте ниже решение

def items(self):
        rows = self._cursor.execute('SELECT key, value FROM dict_table')
        for row in rows:
            yield (row)
...