Почему «c.execute (...)» прерывает цикл? - PullRequest
3 голосов
/ 17 декабря 2010

Я пытаюсь изменить некоторые данные в файле sqlite3, и мои несуществующие знания в области python и google-fu заставили меня в конечном итоге получить этот код:

#!/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)», он проходит по первым двум строкам таблицы, как и должно быть.Как мне заставить это работать?

Ответы [ 4 ]

5 голосов
/ 17 декабря 2010

Это происходит потому, что как только вы делаете 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()
3 голосов
/ 17 декабря 2010

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

Попробуйте:

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 голосов
/ 17 декабря 2010

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

0 голосов
/ 17 декабря 2010

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

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