Я пробую этот код:
import sqlite
connection = sqlite.connect('cache.db')
cur = connection.cursor()
cur.execute('''create table item
(id integer primary key, itemno text unique,
scancode text, descr text, price real)''')
connection.commit()
cur.close()
Я ловлю это исключение:
Traceback (most recent call last):
File "cache_storage.py", line 7, in <module>
scancode text, descr text, price real)''')
File "/usr/lib/python2.6/dist-packages/sqlite/main.py", line 237, in execute
self.con._begin()
File "/usr/lib/python2.6/dist-packages/sqlite/main.py", line 503, in _begin
self.db.execute("BEGIN")
_sqlite.OperationalError: database is locked
Полномочия для cache.db в порядке. Какие-либо идеи?
Я предполагаю, что вы действительно используете sqlite3, даже если в вашем коде указано иное. Вот некоторые вещи, которые следует проверить:
$ fuser cache.db
ничего не должен сказать) $ sqlite3 cache.db "pragma integration_check;"
$ sqlite3 cache.db ".backup cache.db.bak"
$ sqlite3 cache.db.bak ".schema"
Ошибка прочтите Вещи, которые могут пойти не так и Как повредить файлы базы данных
О, ваша трассировка выдала: у вас конфликт версий. Вы установили старую версию sqlite в свой локальный каталог dist-packages, когда у вас уже есть sqlite3, включенный в ваш дистрибутив python2.6, и вы не нуждаетесь и, вероятно, не можете использовать старую версию sqlite. Сначала попробуйте:
$ python -c "import sqlite3"
и, если это не приведет к ошибке, удалите ваш dist-package :
easy_install -mxN sqlite
, а затем импортируйте sqlite3
в свой код и получайте удовольствие.
Одна из возможных причин блокировки базы данных с SQLite я столкнулся, когда пытался получить доступ к строке, которая была записана одним приложением и прочитана другим одновременно. Вы можете установить тайм-аут занятости в вашей оболочке SQLite, который будет вращаться и ждать, пока база данных станет свободной (в исходном c ++ api функция sqlite3_busy_timeout ). Я обнаружил, что в большинстве случаев достаточно 300 мс.
Но я сомневаюсь, что это проблема, судя по вашему сообщению. Сначала попробуйте другие рекомендации.
База данных заблокирована другим процессом, который записывает в нее данные. Вам придется подождать, пока другая транзакция не будет зафиксирована. См. документацию по connect()
Вот изящный обходной путь для одновременного доступа:
while True:
connection = sqlite3.connect('user.db', timeout=1)
cursor = connection.cursor()
try:
cursor.execute("SELECT * FROM queue;")
result = cursor.fetchall()
except sqlite3.OperationalError:
print("database locked")
num_users = len(result)
# ...