【问题标题】:python, sqlite error? db is locked? but it isnt?python,sqlite错误? db被锁定了?但不是吗?
【发布时间】:2010-10-06 14:42:14
【问题描述】:

我的 sqlite3 数据库中出现“数据库表已锁定”错误。我的脚本是单线程的,没有其他应用程序正在使用该程序(我确实在“SQLite Database Browser.exe”中打开过一次)。我复制了文件,删除原始文件(成功)并重命名了副本,所以我知道当我运行我的脚本时没有进程锁定它,表 B 中的所有内容都无法写入,看起来表 A 很好。发生了什么事?

-编辑- 我修复了它,但不确定如何。我注意到代码没有做正确的事情(我复制了错误的字段),在修复并清理它之后,它神奇地又开始工作了。

-edit2-

其他人发布了,所以我不妨更新一下。我认为问题是我试图用正在使用的命令/光标来做一个语句。

【问题讨论】:

  • 你能把你的代码减少到一个最小的非工作示例并发布吗?
  • 没有代码,就不可能知道你在说什么。顺便说一句,如果您的应用程序是多线程的或创建子进程,也请包括这一事实。

标签: python sqlite locking


【解决方案1】:

我以前也遇到过这个问题。当您打开游标和连接,然后您的程序在您可以正确关闭它之前崩溃时,它经常发生。在某些情况下,可以使用以下函数来确保数据库已解锁,即使在事先未正确提交和关闭数据库之后也是如此:

from sqlite3 import dbapi2 as sqlite


def unlock_db(db_filename):
    """Replace db_filename with the name of the SQLite database."""
    connection = sqlite.connect(db_filename)
    connection.commit()
    connection.close()

【讨论】:

    【解决方案2】:

    也许您的应用程序在 SQLite 事务开始后提前终止。在目录中查找陈旧的-journal 文件并将其删除。

    documentation 也值得浏览一下。

    【讨论】:

    【解决方案3】:

    删除 -journal 文件听起来是个坏建议。见this explanation

    【讨论】:

      【解决方案4】:

      当 db 文件位于 NFS 挂载的文件系统上时,我也看到了此错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-09
        • 2018-06-11
        • 1970-01-01
        • 2013-04-18
        • 1970-01-01
        • 2014-01-26
        • 1970-01-01
        • 2011-02-14
        相关资源
        最近更新 更多