sqlite3.操作错误:数据库被锁定 - 非线程应用

4 投票
2 回答
8512 浏览
提问于 2025-04-15 21:10

我有一个用Python写的应用程序,它出现了一个标准的错误:sqlite3.OperationalError: database is locked。我在网上查了很多资料,但没有找到有效的解决办法(请注意,这个程序没有使用多进程或多线程,而且我已经尝试过增加超时参数)。这个sqlite文件是存储在本地硬盘上的。

下面这个函数是访问sqlite数据库的众多函数之一,它第一次被调用时运行正常,但第二次调用时就会出现上面的错误(这个函数是在另一个函数的for循环中被调用的):

def update_index(filepath):
    path = get_setting('Local', 'web')
    stat = os.stat(filepath)
    modified = stat.st_mtime
    index_file = get_setting('Local', 'index')

    connection = sqlite3.connect(index_file, 30)
    cursor = connection.cursor()
    head, tail = os.path.split(filepath)
    cursor.execute('UPDATE hwlive SET date=? WHERE path=? AND name=?;', (modified, head, tail))
    connection.commit()
    connection.close()

非常感谢。

2 个回答

1

你真的有必要每次更新数据库时都打开和关闭数据库文件吗?如果你在每个访问数据库的函数里都这样做,那是不是有可能你从另一个已经打开了数据库的函数里调用了 update_index 函数,而那个函数是用不同的连接在修改数据库的呢?

2

你可能需要特别注意那些保持读取锁的函数(未完成的游标)。这会阻止更新函数提交更改。值得一提的是,Python-sqlite问题有一个专门的邮件列表,你可以在这里找到帮助:http://groups.google.com/group/python-sqlite

撰写回答