2010-12-17 6 views
2

Я пытаюсь изменить некоторые данные в файле sqlite3 и я мое несуществующее знание в питоне и Google-фу меня в конечном итоге с этим кодом:Почему «c.execute (...)» прерывает цикл?

#!/usr/bin/python 
# Filename : hello.py 

from sqlite3 import * 

conn = connect('database') 

c = conn.cursor() 

c.execute('select * from table limit 2') 

for row in c: 
    newname = row[1] 
    newname = newname[:-3]+"hello" 
    newdata = "UPDATE table SET name = '" + newname + "', originalPath = '' WHERE id = '" + str(row[0]) + "'" 
    print row 
    c.execute(newdata) 
    conn.commit() 
c.close() 

Он работает как шарм в первом ряду но по какой-то причине он запускает цикл только один раз (изменяется только первая строка в таблице). Когда я удаляю «c.execute (newdata)», он проходит через первые две строки таблицы, как и должно быть. Как мне заставить работать?

ответ

3

Это делается потому, что как только вы сделаете c.execute(newdata), курсор больше не указывает на исходный результирующий набор. Я бы сделал это следующим образом:

#!/usr/bin/python 
# Filename : hello.py 

from sqlite3 import * 

conn = connect('database') 

c = conn.cursor() 

c.execute('select * from table limit 2') 
result = c.fetchall() 

for row in result: 
    newname = row[1] 
    newname = newname[:-3]+"hello" 
    newdata = "UPDATE table SET name = '" + newname + "', originalPath = '' WHERE id = '" + str(row[0]) + "'" 
    print row 
    c.execute(newdata) 
conn.commit()  
c.close() 
conn.close() 
1

Когда вы вызываете c.execute(newdata), он меняет курсор c так, чтобы for row in c: сразу же выходил.

Try:

c = conn.cursor() 
c2 = conn.cursor() 

c.execute('select * from table limit 2') 

for row in c: 
    newname = row[1] 
    newname = newname[:-3]+"hello" 
    newdata = "UPDATE table SET name = '" + newname + "', originalPath = '' WHERE id = '" + str(row[0]) + "'" 
    print row 
    c2.execute(newdata) 
    conn.commit() 
c2.close() 
c.close() 
+0

Вам не нужны 2 курсора, не так ли? Просто сохраните результат первого вызова вызова и повторите его. – 2010-12-17 15:38:30

0

Поскольку повторное использование «с» внутри цикла аннулирует «с», который вы используете в качестве итератора цикла. Сделайте отдельный курсор для запросов в цикле.

0

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

Смежные вопросы