我想使用 python-sqlite3 打开位于 ~/.config/chromium/Default 目录下的 Chromium 站点数据,但在 Chromium 运行时它被锁定,这是可以理解的,因为可能正在进行事务。有没有一种方法以只读模式打开它,确保我在 Chromium 使用它时不会破坏数据库的完整性?
看起来我们可以通过以immutable
模式打开数据库来绕过锁定,例如:
sqlite3 'file:places.sqlite?immutable=1'
SQLITE_IOCAP_IMMUTABLE
,所以最好的方法是使用标志SQLITE_OPEN_READONLY | SQLITE_OPEN_URI
打开连接,以允许将file:...?immutable=1
URI作为filename
传递。Chromium长时间持有数据库锁?糟糕!这真的不是一个好主意。但这并不是你的错。
你可以尝试仅复制数据库文件(例如使用系统实用程序cp
),并使用该快照进行阅读;SQLite将其所有提交状态保存在每个数据库的单个文件中。是的,有可能看到部分事务,但在Unix上,您绝对不会遇到锁定问题,因为SQLite绝对不使用强制锁定。(由于Windows上的不同锁定方案,这可能无法正常工作。)
places.sqlite
并发访问的“正确”解决方案。对于Firefox来说,情况是一样的,错误信息也相同。只需更改您的程序以在副本上运行,并尽情享受生活,而不必担心PRAGMA main.journal_mode=WAL
和 SQLITE_OPEN_READONLY
,也不必翻阅C API文档,只能发现用Python的sqlite3
库做不到这一点或那一点。 - TheDudeAbides
echo "SELECT ..." | sqlite3 'file:///home/my_user/.mozilla/firefox/12wh3gmq.work/cookies.sqlite?immutable=1'
对我有用!其他的方法,如sqllite3 -readonly ...
或sqlite3 ...?mode=ro
都没有帮助。同时,sqlite3 'file://~/.mozilla/firefox/12wh3gmq.work/cookies.sqlite?immutable=1'
也不起作用。 - jhutar