【问题标题】:Opening sqlite3 database with no write access打开没有写入权限的 sqlite3 数据库
【发布时间】:2016-12-06 10:14:32
【问题描述】:

我正在尝试从 Python 对 SQLite 数据库执行查询。问题是,我没有数据库文件的写权限,也没有包含数据库文件的目录。

当我连接到数据库并执行 SELECT 查询时,我收到“无法打开数据库文件”错误。我尝试按照this answer 的建议进行操作,但没有奏效。我猜 SQLite 在尝试创建锁定文件时会失败。

当我对目录有写权限,但对 sqlite 文件没有权限时,我得到另一个错误 - 锁定错误。这是因为 sqlite 创建的 shm 和 wal 文件与 db 文件具有相同的权限,这意味着我得到了无法写入的 shm 和 wal 文件,从而导致锁定错误。

除了将所有文件复制到我有完全访问权限的目录之外,还有其他方法吗?

【问题讨论】:

    标签: python sqlite permissions


    【解决方案1】:

    documentation 说:

    无法打开只读 WAL 数据库。如果该文件存在,则打开进程必须对与数据库关联的“-shm”wal-index 共享内存文件具有写权限,或者如果“-shm”文件不存在,则对包含数据库文件的目录具有写权限。

    为了允许对该数据库进行只读访问,一些具有写入权限的用户需要将其更改为其他一些journal mode

    【讨论】:

    • 如果我对文件夹有写权限但对文件没有写权限,则创建-shm文件,但我没有写权限(sqlite只是复制db文件的权限)。这是一个bug,不知道是Python wrapper还是sqlite本身的bug。
    • 从 3.22 版(2018-01-22)开始,在特定条件下支持只读 WAL 数据库:sqlite.org/wal.html#read_only_databases
    【解决方案2】:

    您可以使用以下语法以读取模式打开sqlite3 连接:

    con = sqlite3.connect('file:path/to/database.sqlite?mode=ro', uri=True)
    

    【讨论】:

    • 这是我已经引用的答案。这是行不通的。连接可能处于只读模式,但文件和目录需要是可写的。
    • 这不是一个正确的答案,但我在寻找什么。
    猜你喜欢
    • 2012-07-15
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2014-09-02
    • 2017-07-17
    • 1970-01-01
    相关资源
    最近更新 更多