Проблема в том, что для соединения должен быть не более одного активного курсора.
Решение состоит в том, чтобы использовать новое соединение для обновлений.
К сожалению, я не помню точное место в документах, где я его читал, поэтому я не могу доказать это.
UPD
Следующий код работает на моей Windows XP:
import sqlite3
import os
conn1 = sqlite3.connect('test.db')
cursor1 = conn1.cursor()
conn2 = sqlite3.connect('test.db')
cursor2 = conn2.cursor()
cursor1.execute("CREATE TABLE my_table (a INT, b TEXT)")
cursor1.executemany("INSERT INTO my_table (a, b) VALUES (?, NULL);", zip(range(5)))
conn1.commit()
cursor1.execute("SELECT * FROM my_table")
for a, b in cursor1:
cursor2.execute("UPDATE my_table SET b='updated' WHERE a = ?", (a, ))
conn2.commit()
print "results:"
print 10 * '-'
cursor1.execute("SELECT * FROM my_table")
for a, b in cursor1:
print a, b
cursor1.close()
conn1.close()
cursor2.close()
conn2.close()
os.unlink('test.db')
И возвращает следующее, как и ожидалось:
results:
----------
0 updated
1 updated
2 updated
3 updated
4 updated
Если я переместу conn2.commit()
в цикл for, я получу ту же ошибку, о которой вы упоминали:
Traceback (most recent call last):
File "concurent.py", line 16, in <module>
conn2.commit()
sqlite3.OperationalError: database is locked
Таким образом, решение состоит в том, чтобы фиксировать один раз в конце вместо фиксации после каждой строки.