如何以具有持久性的只读模式打开 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 数据库?的主要内容,如果未能解决你的问题,请参考以下文章