sqlite вложено для ошибки цикла - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь создать чат-бот, но столкнулся с небольшой проблемой.У меня есть вложенный или цикл в Python, и он должен циклически перебирать таблицу sqlite, в которой были все имена других таблиц.Внутренний цикл for циклически перебирает таблицу внутри первой, перебирая ячейки.

for i in c.execute("""SELECT * FROM triggers_sql"""):
    for l in c.execute("""SELECT * FROM "{}" """.format(i)):
        print(i, l)

Однако по какой-то причине внешний цикл for циклически проходит только первую ячейку первой таблицы.Я не могу думать ни о чем, что я сделал здесь неправильно.

1 Ответ

0 голосов
/ 08 октября 2018

Вам нужно использовать два отдельных курсора , чтобы сделать это.Курсор представляет один набор результатов, внутренний c.execute() очищает набор результатов, который внешний цикл прикрепил к курсору.

Если c является объектом подключения, вам необходимо явно создать курсоры из этого:

outercursor = c.cursor()
for tablename, in outercursor.execute("SELECT tablename FROM triggers_sql"):
    innercursor = c.cursor()
    for row in innercursor.execute('SELECT * FROM "{}"'.format(tablename)):
        # ...

Если c является объектом курсора, просто создайте еще один объект из соединения.Вы даже можете сделать это из существующего курсора с помощью:

innercursor = c.connection.cursor()

Обратите внимание, что, вероятно, существуют более эффективные способы структурирования вашей базы данных, когда вам не нужно использовать динамические имена таблиц.Храните все, для чего вы сейчас используете отдельные таблицы, в одной таблице с одним дополнительным столбцом, заменяющим имя таблицы.В этот момент вы можете использовать JOIN и оставить его на sqlite, чтобы беспокоиться о том, как создать цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...