Python SQLite: 数据库被锁定

71 投票
23 回答
193417 浏览
提问于 2025-04-15 22:10

我正在尝试这段代码:

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的权限设置是正确的。有什么建议吗?

23 个回答

61

在你的连接调用中设置超时时间参数,像这样:

connection = sqlite.connect('cache.db', timeout=10)
65

我猜你实际上是在使用sqlite3,尽管你的代码上写的不是。这里有一些需要检查的地方:

  1. 确认没有进程在占用这个文件(在Unix系统上,可以用命令 $ fuser cache.db 来检查,如果没有任何输出就说明没问题)。
  2. 检查目录里是否有一个叫cache.db-journal的文件;如果有,说明之前的会话崩溃了,没有被正确清理。
  3. 让数据库自己检查一下:可以用命令 $ sqlite3 cache.db "pragma integrity_check;"
  4. 备份一下数据库:用命令 $ sqlite3 cache.db ".backup cache.db.bak"
  5. 如果你只是学习,可能里面没有什么内容,可以删除cache.db,然后再试试你的代码。
  6. 看看备份是否有效:用命令 $ sqlite3 cache.db.bak ".schema"

如果这些都不行,可以看看 可能出现的问题如何损坏你的数据库文件

13

原来问题出在数据库文件的路径其实是一个通过samba挂载的目录。我把它移动到其他地方,这样就正常工作了。

撰写回答