【问题标题】:sqlite3.OperationalError: database is lockedsqlite3.OperationalError:数据库被锁定
【发布时间】:2011-04-03 13:20:27
【问题描述】:

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

...
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

有什么办法可以解决这个问题?

【问题讨论】:

标签: python sqlite


【解决方案1】:

当您尝试提交失败的操作时,您的代码中其他地方是否有另一个连接用于启动仍处于活动状态(未提交)的事务?

【讨论】:

  • 只有与 sqlite3 相关的代码:import sqlite3 as lite db_name="diziport.sqlite"
  • 先生,我真的很抱歉,但是在关闭交互式解释器(处于活动模式)后它现在正在工作
  • @hasseg 很高兴知道如何修复它而无需重新启动 Python。我试过 cursor.close() 和 connection.close()、del(cursor)、del(connection)。仍然出现此错误。
  • 注意 python 的 sqlite3 模块默认为你提供了一个连接,你必须提交每个更改。这意味着一个未提交的更改很容易做到。如果您想要“自动提交模式”(不需要显式提交),请与 isolation_level=None 连接。
【解决方案2】:

因为您的数据库正被另一个进程或连接使用。如果您需要真正的并发,请使用真正的 RDBMS。

【讨论】:

  • 不一定正确。 Berkeley DB 的 SQL API 支持易于使用的 SQLite API 以及并发读写操作。你可以在这里阅读:bit.ly/hY6MTm.
  • Sqlite可以通过开启WAL模式和增加超时时间来支持更好的并发。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    相关资源
    最近更新 更多