В Python, что может привести к тому, что цикл for будет случайным образом возвращаться в значение? - PullRequest
1 голос
/ 04 марта 2011

Что может заставить итератор идти вперед в цикле, а затем назад?

Это код, который я использую для циклического обхода поля первичного ключа таблицы.Первичный ключ используется для заполнения начальных значений в отдельной таблице.

Для цикла:

for row in sampleDB.select_fromTable():
    print row[0]
    sampleDB.insert_toTable(row[0], 2.0)

Оператор вставки sqllite:

def insert_toTable(self, primaryKey, initial):
    c = self.conn.cursor()
    c.execute('insert into insert_toTable VALUES(?, ?)', (primaryKey, initial))
    if c.rowcount == 1:
        print "Updated row.\n"
    else:
        print "Row does not exist.\n"

    self.conn.commit()
    c.close()

Оператор выбора, которыйсоздает кортеж для цикла:

def select_fromTable(self):
    c = self.conn.cursor()
    c.execute('select * from sampleTable')

    c.close

    return c

Вот пример таблицы:

Primary Key     Text
0               John
1               Sue
2               Bill
3               Tyler

Выполнение цикла без оператора вставки печатает каждый уникальный ключ один раз, но если я добавлю вызовк функции вставки (insert_toTable) я получаю это явление:

0
Updated row.

1
Updated row.

0
Traceback (most recent call last):
sqlite3.IntegrityError: column urlid is not unique

Следующая итерация цикла должна быть с уникальным значением "2", а не с "0" ....

При необходимости могу предоставить больше разделов кода.

1 Ответ

4 голосов
/ 04 марта 2011

Я подозреваю, что результаты этого кода могут измениться в зависимости от того, какие именно версии sqlite и python используются.

Обратите внимание, что ваш вызов c.close в методе select_fromTable должен быть c.close(). Это удачная ошибка, так как вы не можете перебирать результаты запроса после закрытия курсора. Однако в результате у вас есть два открытых курсора в цикле.

Попробуйте изменить select_fromTable метод на:

def select_fromTable(self):
    c = self.conn.cursor()
    c.execute('select * from sampleTable')
    results = c.fetchall()
    c.close()
    return results

и посмотри, что получится. Я верю, что это решит вашу проблему.

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