sqlite3.OperationalError: 数据库被锁定 - 非线程应用程序

4
我有一个Python应用程序,它会抛出标准的sqlite3.OperationalError:数据库已锁定错误。我在互联网上搜索了一圈,没有找到任何解决方法(请注意,没有多进程/线程正在运行,并且正如您所见,我已尝试提高超时参数)。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个回答

2

你可能需要检查一下那些保持读锁(未完成的游标)的函数。这会阻止更新函数提交。请注意,有一个专门的邮件列表处理Python-sqlite问题:http://groups.google.com/group/python-sqlite


1

你真的需要为每个单独的UPDATE操作不断地打开和关闭数据库文件吗?如果在访问数据库的每个函数中都做同样的事情,那么有可能你已经从另一个使用不同连接打开数据库并正在修改数据库的函数中调用了update_index函数吗?


在调用此函数之前,应完全关闭数据库。如果我要保持数据库连接开启,最好的方法是什么?将connection实例存储在函数作用域之外还是作为参数传递? - james the seventh
3
如果你创建一个类并将所有与数据库交互的函数放入其中,将连接作为类的成员属性,则代码会更整洁。你可以在类的__init__方法中创建连接,并添加一个close_connection(功能显而易见)方法,用于在使用完毕后关闭连接。否则,你可以搜索代码并在每次打开和关闭数据库连接时添加调试语句,以查看它们是否嵌套。 - tzot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接