为什么我会收到 sqlite 错误,“无法打开数据库文件”?

Nic*_*ton 72 django sqlite

使用我的 Django 应用程序,我可以很好地从数据库中读取数据。当应用程序没有访问文件的权限时,它给了我这个错误:

尝试写一个只读数据库

这是有道理的。所以我编辑了文件的权限,让Apache进程有写权限。但是,我收到了这个神秘的错误,而不是能够写入:

无法打开数据库文件

如果它有用,这里是整个输出:

Request Method: POST
Request URL:    http://home-sv-1/hellodjango1/polls/1/vote/
Exception Type: OperationalError
Exception Value:    
unable to open database file
Exception Location: /usr/lib/pymodules/python2.5/django/db/backends/sqlite3/base.py in execute, line 193
Python Executable:  /usr/bin/python
Python Version: 2.5.2
Python Path:    ['/var/www', '/usr/lib/python2.5', '/usr/lib/python2.5/plat-linux2', '/usr/lib/python2.5/lib-tk', '/usr/lib/python2.5/lib-dynload', '/usr/local/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages', '/usr/lib/pymodules/python2.5', '/usr/lib/pymodules/python2.5/gtk-2.0']
Server time:    Sun, 23 Aug 2009 07:06:08 -0500
Run Code Online (Sandbox Code Playgroud)

如果需要堆栈跟踪,请告诉我。

Nic*_*ton 87

啊哈,刚刚偶然发现了一篇解释这个的文章。Django 在他们的NewbieMistakes页面上也有信息。

解决方案是确保包含数据库文件的目录也具有对该进程的写访问权限。

就我而言,运行此命令解决了问题:

sudo chown www-data .
Run Code Online (Sandbox Code Playgroud)

  • 这假设您使用的是 debian/ubuntu,如果您使用 CentOS,您将要使用“apache”而不是“www-data” (4认同)
  • 我相信额外的点是将组设置为所有者的默认组。否则它不会更改组。这只是凭记忆,我强烈建议您自己尝试一下。 (4认同)
  • @nbolton 注意:`chown www-data。.` 实际上应该是 `chown www-data .` 否则有一些我不知道的 chown 命令魔法......请赐教。 (3认同)

ssc*_*ssc 7

来自Django 说“Unable to Open Database File” when using SQLite3 section of the Newbie errors Django wiki page

  1. 确保 Apache 也可以写入数据库的父目录
  2. 确保数据库文件的完整路径的文件夹都没有以数字开头
  3. 确保db目录的完整路径存在
  4. 确保您的/tmp目录是全球可写的
  5. 确保指定的数据库settings.py路径是完整路径
  6. 确保路径中没有特殊字符
  7. 在 Windows 上,确保 db 目录路径用双反斜杠写入


小智 7

我对此的解决方案更像是这样。我真的不想改变这个目录的所有权。(主要是因为我使用 pi 用户来做诸如 git 之类的事情)

/var/www/mysite $ ls -la sql*
-rw-rw-r-- 1 pi       pi       25600 Jan  2 22:57 sqlite.db
Run Code Online (Sandbox Code Playgroud)

(或您正在使用的任何数据库)

其中 pi 是我在其中创建所有文件的用户。(是的,这是一个树莓派)

我发现我只需要像这样更改权限,而不是更改对 www-data 的权限:

sudo chmod 775 /var/www/mysite
sudo chmod 664 /var/www/mysite/sqlite.db
sudo usermod -a -G pi www-data
Run Code Online (Sandbox Code Playgroud)

这为组提供了对必要文件的写访问权限,并将 www-data 用户添加到 pi 组。

注意:如果您有日志记录,您也需要为 django 日志文件执行此操作,否则 apache 不会很喜欢它。


小智 5

将操作用户添加到 www-data 组在我的测试环境中运行良好。此外,我已将 sqlite3.db 文件放入单独的子文件夹中,以提高安全性。

数据库文件归www-data所有

sudo chown www-data mysite/db_sqlite3/
sudo chown www-data mysite/db_sqlite3/my.db
Run Code Online (Sandbox Code Playgroud)

我的操作用户 hape 获得了 www-data 组的成员:

sudo usermod -a -G www-data hape
Run Code Online (Sandbox Code Playgroud)

允许对 www-data 组成员的数据库文件写入访问权限:

sudo chmod u+w+x,g+w+x mysite/db_sqlite3/
sudo chmod u+w+x,g+w+x mysite/db_sqlite3/my.db
Run Code Online (Sandbox Code Playgroud)

因此,数据库可以通过 apache2-daemon(用户 www-data)进行读写访问,而无需授予项目根文件夹的权限,并且 - 另一方面 - 该应用程序可以由操作员在开发模式下运行用户喜欢,例如

./manage.py runserver
Run Code Online (Sandbox Code Playgroud)

还。