sqlite вложена грешка за цикъл

Опитвам се да направя ChatBot, но се натъкнах на малък проблем. Имам вложен или цикъл в 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