sqlite3.OperationalError: 数据库被锁定

13

我正在尝试将列表的所有值插入到我的sqlite3数据库中。当我使用Python交互解释器模拟此查询时,我能够正确地将单个值插入到数据库中。但是在使用迭代时,我的代码失败了:

...
connection=lite.connect(db_name)
cursor=connection.cursor()
for name in match:
         cursor.execute("""INSERT INTO video_dizi(name) VALUES (?)""",(name,))
connection.commit()
...

error:cursor.execute("""INSERT INTO video_dizi(name) VALUES (?)""",(name,))
sqlite3.OperationalError: database is locked

有什么方法可以克服这个问题吗?


1
关于此错误的详细描述,请参见此答案:https://dev59.com/6V8d5IYBdhLWcg3waxgp#26864360 - sajjadG
这个回答是否解决了你的问题?操作错误:数据库被锁定 - sebisnow
3个回答

14

你的代码中是否有另一个连接用于开始事务,但在尝试提交失败操作时仍处于活动状态(未提交)?


仅包含与sqlite3相关的代码: import sqlite3 as lite db_name="diziport.sqlite" - Fish
3
先生,非常抱歉,但在关闭交互式解释器(活动模式下)后,它现在正在工作。 - Fish
@hasseg 很好知道如何在不重启 Python 的情况下修复它。我已经尝试了 cursor.close() 和 connection.close(),del(cursor),del(connection)。仍然出现这个错误。 - eric
请注意,Python的sqlite3模块默认提供了一个连接,您必须在其中提交每个更改。这意味着未提交的更改很容易出现。如果您想要“自动提交模式”(不需要显式提交),请使用isolation_level=None进行连接。 - dfrankow

1
由于您在DBbrowser类型应用程序中打开了site.db或数据库文件以在交互式数据库界面中查看,因此可能会出现此错误。只需关闭它,它就可以正常工作。

0

因为您的数据库正在被另一个进程或连接使用。如果您需要真正的并发性,请使用真正的关系型数据库管理系统。


1
并非一定如此。Berkeley DB的SQL API支持易于使用的SQLite API以及并发读写操作。您可以在此处阅读有关它的信息:http://bit.ly/hY6MTm。 - dsegleau
1
通过打开WAL模式并增加超时时间,Sqlite可以支持更好的并发性。 - Erik Aronesty

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