是否可以在只读模式下打开一个锁定的sqlite数据库?

lad*_*ini 12 python database sqlite

我想用python-sqlite3打开铬站点数据(在〜/ .config/chromium/Default中),但是当chrome运行时它会被锁定,这是可以理解的,因为可以进行交易.有没有办法以只读模式打开它,确保在使用它时我不能破坏数据库的完整性?

Val*_*Val 10

看来我们可以通过以模式打开数据库来绕过锁immutable,例如:

sqlite3 'file:places.sqlite?immutable=1'
Run Code Online (Sandbox Code Playgroud)

正如这里所解释的https://www.sqlite.org/c3ref/open.html

如果底层数据库文件发生更改,或者显然没有看到对文件进行的更新,这可能会导致查询错误,但我发现在每个新查询上重新打开连接有助于解决此问题。

要使用大多数 SQLite 驱动程序实现相同的目标,因为我们无法直接设置SQLITE_IOCAP_IMMUTABLE,最好的方法是使用标志打开连接SQLITE_OPEN_READONLY | SQLITE_OPEN_URI以允许将file:...?immutable=1URI 作为传递filename


Nts*_*alt 8

我认为这取决于交易设置的锁定.

http://www.sqlite.org/lockingv3.html#shared_lock http://www.sqlite.org/lang_transaction.html

SQLite独占事务锁定读取和写入,其中立即和延迟事务仍将允许读者.

所以它真的取决于Chromium使用的交易.


Don*_*ows 6

Chromium 长时间持有数据库锁?糟糕!这真的不是一个很好的主意。不过,不是你的错……

您可以尝试只复制数据库文件(例如,使用系统实用程序cp)并使用该快照进行读取;SQLite 将所有提交的状态保存在每个数据库的单个文件中。是的,有可能会看到部分事务,但是在 Unix 上您绝对不会遇到锁定问题,因为 SQLite 绝对不使用强制锁定。(由于那里的锁定方案不同,这在 Windows 上很可能不起作用。)

  • 这不一定是铬的错。四处窥探,我发现 [this](http://mail.python.org/pipermail/python-list/2009-July/1211171.html) 有用的消息指出 pysqlite 库不提供所有接口sqlite 的特性,因为它符合 DB-API。所以可能是当我用 pysqlite 打开数据库时,我是在读写模式下这样做的。他指出 APSW 在启动连接时使用 SQLITE_OPEN_READONLY 标志。我现在去看看。 (2认同)
  • 这是我使用的解决方法,因为我在 15 个浏览器选项卡中迷失了方向,试图找出并发访问 Firefox 的“places.sqlite”的“正确”解决方案。与 Firefox 相同,错误消息相同。只需更改您的程序以在副本上工作并享受更多生活,而不必担心`PRAGMA main.journal_mode=WAL`s 和`SQLITE_OPEN_READONLY`s 并仔细阅读 C API 文档,却发现您做不到这个或那个与 Python 的 `sqlite3` 库。 (2认同)