sqlite вложенный для ошибки цикла

Я пытаюсь создать чат-бота, но столкнулся с небольшой проблемой. У меня есть вложенный или цикл в 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 проходит только через первую ячейку первой таблицы. Я не могу думать ни о чем, что я сделал неправильно здесь.


person Harry Le    schedule 08.10.2018    source источник
comment
Не используйте динамические имена таблиц, это почти всегда указывает на плохой дизайн базы данных.   -  person Tomalak    schedule 08.10.2018


Ответы (1)


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

person Martijn Pieters    schedule 08.10.2018
comment
Итак, как мне получить два курсора? Желательно самый простой, но действенный способ. - person Harry Le; 08.10.2018
comment
@HarryLe: как ты получил один курсор для начала? Или c является объектом соединения? - person Martijn Pieters; 08.10.2018
comment
c — это курсор. - person Harry Le; 08.10.2018
comment
@HarryLe: тогда посмотри, как ты создал этот курсор. Создайте еще один. Вы не ограничены только одним курсором. - person Martijn Pieters; 08.10.2018