如何以具有持久性的只读模式打开 Sqlite3 数据库?

Posted

技术标签:

【中文标题】如何以具有持久性的只读模式打开 Sqlite3 数据库?【英文标题】:How to open a Sqlite3 database in read-only mode with persistent? 【发布时间】:2015-07-10 16:09:15 【问题描述】:

我目前使用来自 persistent-sqlite 的createSqlitePool

import Database.Persist.Sqlite

createSqlitePool "mydb.db" 10

根据 Sqlite3 文档,我可以在连接字符串中传递其他参数,例如

"Data Source=c:\mydb.db;Version=3;Read Only=True;"

参照。 https://www.connectionstrings.com/sqlite-net-provider/read-only-connection/

显然,不能简单地将这个连接字符串传递给createSqlitePool。有没有办法告诉persistent-sqlite 以只读方式打开我的数据库?

【问题讨论】:

sqlite 是一个基于文件的数据库,没有“连接字符串”的概念。它甚至没有连接,因为这里的 dbms 只是你程序中的一个库。 【参考方案1】:

我认为这是您链接到的 .NET 特定信息,因此它可能不适用于此处。

如果你查看the code,persistent 只是调用 SQLite C 函数 sqlite3_open,它只接受数据库的文件名。

如果您想将连接设为只读,它看起来需要使用带有附加标志的sqlite3_open_v2

不过,您可能可以使用文件权限来实现相同的目的,因为如果用户没有权限,他们将无法写入 SQLite DB 文件。

【讨论】:

在 Persistent 上打开一个关于这个@ruben.moor 的问题似乎是合理的。自己实现可能也不是太难。 我将尝试对 db 文件具有简单只读权限的方法。这听起来足以满足所有实际用途。不过,有人可能会争辩说,在 haskell 代码中指定的只读访问更简洁(取决于具体情况),我也会对此进行必要的更改。【参考方案2】:

Persistent 现在支持连接字符串中的 Sqlite3-URI-syntax,如下所述:

https://github.com/yesodweb/persistent/wiki/Database-Configuration

因此,对于像这样的只读操作:

URI 文件名样式,相对路径,只读:

file:sqlite3.db?mode=ro

【讨论】:

以上是关于如何以具有持久性的只读模式打开 Sqlite3 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

java + sqlite:如何以只读方式打开数据库?

以只读模式打开 JdbcTemplate 连接?

使用 Pandas HDFStore 以只读模式打开文件

Sqlite3 数据库在 Docker 容器中保持只读且不可创建。如何让它可写?

如何使用Emacs更改文件的读/写模式?

只读模式下不允许写操作 - 持久化时出现问题