确定一个sqlite3数据库是否为只读

3
我想打开一个sqlite3数据库,并立即检查它是否是只读的。由于我知道我需要对其进行写入,因此我希望在启动时立即返回错误,而不必等到程序首次尝试执行写操作时再返回错误。
我看到有一个sqlite3 C API函数sqlite3_db_readonly()。是否可能从Python API访问此函数?或者从Python API中是否有其他方法来检查数据库是否为只读?

你必须费尽周折地以只读模式打开它。为什么你不知道它是只读的呢? - Peter Wood
如果DB文件没有写入权限,则会以只读模式打开。 - Craig McQueen
你可以使用 os.access,例如:os.access(db, os.W_OK) - Peter Wood
是的,我确实想要在所有情况下都能够运行良好的程序。我希望避免编写糟糕的代码。 - Craig McQueen
三年半后呢? - Peter Wood
显示剩余2条评论
2个回答

7
除了之前提到的其他可能性,您可以尝试直接向其编写。例如,如果数据库的user_version为0(除非已更改),则发出pragma user_version=0;。如果数据库是可写的,则此操作不会产生任何影响,但如果数据库是只读的,则会导致错误。

2

不和是的。查看Python标准库sqlite3的源代码。

rc = sqlite3_open_v2(database, &self->db,
                        SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE |
                       (uri ? SQLITE_OPEN_URI : 0), NULL);

这意味着即使您没有设置uri,当文件处于只读模式时,它也会以只读模式打开。在代码中搜索,没有调用sqlite3_db_readonly(),因此您无法使用 sqlite3 库进行此操作。

但是是的,还有其他库,例如APSW

`static PyObject*
Connection_readonly(Connection *self, PyObject *name)
{
  int res=-1;
  res=sqlite3_db_readonly(self->db, PyBytes_AS_STRING(utf8name));
}`

如果要只读访问连接,请阅读文档并调用 Connection.readonly(name)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接