【问题标题】:sqlite3.OperationalError: database is locked - non-threaded applicationsqlite3.OperationalError:数据库被锁定 - 非线程应用程序
【发布时间】:2010-04-02 21:14:40
【问题描述】:

我有一个 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()

非常感谢。

【问题讨论】:

    标签: python sql sqlite


    【解决方案1】:

    您可能会特别检查保持读锁(未完成光标)的函数。这将阻止更新功能的提交。请注意,有一个专门针对 Python-sqlite 问题的邮件列表:http://groups.google.com/group/python-sqlite

    【讨论】:

      【解决方案2】:

      您真的需要为每个 UPDATE 持续打开和关闭数据库文件吗?如果您在访问数据库的每个函数中都执行相同的操作,那么您是否有可能从另一个函数调用了 update_index 函数,该函数已经使用不同的连接打开了数据库并且正在处理中修改数据库?

      【讨论】:

      • 在调用此函数之前,应完全关闭数据库。如果我要保持数据库连接打开,最好的方法是什么?将connection实例存储在函数作用域之外,还是作为参数传递?
      • 如果你做一个类,将所有处理数据库的函数放在类中,将连接作为类的成员属性,会更整洁。您可以在__init__ 类中创建连接并添加一个close_connection(内容明显)方法,您在完成后调用该方法。否则,您可以在打开和关闭与数据库的连接时搜索代码并添加调试语句,查看它们是否嵌套。
      猜你喜欢
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      相关资源
      最近更新 更多