Python SQLite: 数据库被锁定

69

我尝试了这段代码:

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个回答

3

如果您的数据库上没有运行DBMS管理和开发平台(如pgAdmin),那么您应该检查一下,因为这很可能是此错误最常见的原因。 如果有-提交所做的更改,问题就解决了。


2
我遇到了同样的问题:sqlite3.IntegrityError
正如许多答案中提到的那样,问题在于连接没有正确关闭。
在我的情况下,我使用了tryexcept块。我在try块中访问数据库,当出现异常时,我想在except块中做一些其他事情。
try:
    conn = sqlite3.connect(path)
    cur = conn.cursor()
    cur.execute('''INSERT INTO ...''')
except:
    conn = sqlite3.connect(path)
    cur = conn.cursor()
    cur.execute('''DELETE FROM ...''')
    cur.execute('''INSERT INTO ...''')

然而,在引发异常时,来自try块的连接尚未关闭。我使用块内的with语句解决了这个问题。
try:
    with sqlite3.connect(path) as conn:
        cur = conn.cursor()
        cur.execute('''INSERT INTO ...''')
except:
    with sqlite3.connect(path) as conn:
        cur = conn.cursor()
        cur.execute('''DELETE FROM ...''')
        cur.execute('''INSERT INTO ...''')

你什么时候进行“提交(commit)”? - Mausy5043

2
  1. 您的cache.db文件正在被其他进程使用。
  2. 停止该进程并重试,应该可以正常工作。

2

另外一种可能性就是我遇到的情况,我打开了两次数据库,第一次打开阻止了第二次。请检查您是否这样做了。


2
在我的情况下,“锁定”消息是由于我在DB BROWSER(SQL LITE)中进行的未保存更改导致的,我必须保存它们,然后再次执行我的脚本,问题就解决了。希望这能帮助像我这样的人。

1

哦,你的 traceback 已经透露了问题所在:你存在版本冲突。当你已经在 Python2.6 发行版中包含 sqlite3 并且不需要、可能无法使用旧版 sqlite 时,你在本地 dist-packages 目录下安装了一些旧版本的 sqlite。首先尝试执行以下命令:

$ python -c "import sqlite3"

如果这不会给你错误,请卸载你的dist-package

easy_install -mxN sqlite

在你的代码中使用import sqlite3,然后尽情享受编程的乐趣。

我检查了使用sqlite3,它有不同的运作方式。它会创建一个db-journal文件并等待。然后"database is locked" ,而没有 "3" 的sqlite则不需要等待任何东西。 - Soid

1
我在使用Pycharm和另一个用户提供的数据库时遇到了问题。
以下是我解决问题的方法:
1.关闭所有在Pycharm中操作有问题的数据库的选项卡。 2.从Pycharm右上角的红色方块按钮停止所有正在运行的进程。 3.从目录中删除有问题的数据库。 4.重新上传原始数据库。
然后它又可以工作了。

0
即使我只有一个写入者和一个读取者,我的问题是其中一个读取操作花费的时间太长了:超过了规定的5秒超时时间。因此,写入操作超时并导致了错误。
因此,在从数据库中读取所有条目时要小心,特别是在表的大小随时间增长而增加的情况下。

0

我也遇到过这个问题。我试图将数据输入到数据库中,但没有保存我所做的更改。在保存更改后,问题得到了解决。


2
使用注释来回答这种类型的简短问题。如果你在回答任何问题,请详细解释,增加更多信息,提供示例并提供参考资料。 - Munim Munna

0
简单解决方案:检查一次是否在另一个窗口或终端中打开了数据库。那也会锁定您的数据库。在我的情况下,我关闭了所有其他锁定数据库的终端(Pycharm 中的终端选项卡)。还要检查您的 IDE 的每个终端选项卡,看看是否有留下数据库打开的终端。exit() 所有终端应该可以解锁数据库。

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