为什么出现sqlite错误,“无法打开数据库文件”?


65

使用我的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

让我知道是否需要堆栈跟踪。


它认为您在部署时遇到了这个问题。
Mohammed Shareef C

Answers:


79

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

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

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

sudo chown www-data .

3
这假设您使用的是debian / ubuntu,如果您使用的是CentOS,则将要使用“ apache”而不是“ www-data”
Luke Chadwick

3
@nbolton注意:否则chown www-data. .实际上应该chown www-data .有一些我不知道的chown命令的向导...请赐教。
杰夫·谢菲尔德

3
我相信额外的点是将组设置为所有者的默认组。否则,它不会更改组。不过,这只是出于记忆,我强烈建议您自己尝试一下。
尼克·博尔顿

在将来链接腐烂或tl; dr的情况下进行了总结:SQLite3希望对DB文件的目录具有写访问权限,以便在打开事务时可以在其中创建日记文件。
user1454265

非常适合Linux用户。Windows版Bupkiss。
Jay Blanchard 2015年

7

我对此的解决方案更像是这样。我真的不想更改该目录的所有权。(主要是因为我使用pi用户执行git之类的操作)

/var/www/mysite $ ls -la sql*
-rw-rw-r-- 1 pi       pi       25600 Jan  2 22:57 sqlite.db

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

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

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

sudo chmod 775 /var/www/mysite
sudo chmod 664 /var/www/mysite/sqlite.db
sudo usermod -a -G pi www-data

这使组可以访问必要的文件,并将www-data用户添加到pi组。

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


1
我认为您也可以将pi用户也添加到www-data组。同样,您也可以按原样保留文件,并使用setfacl命令在文件和目录上添加pi的访问控制列表。
slm

setfacl听起来是一个不错的选择。将此列为指导性答案将是很好的。我面临的一个问题是,在测试中,我经常需要删除.db文件。重新创建它时,需要再次对其进行阻塞。
SpiRail

请参阅我对这个问题的答案serverfault.com/a/462970/2518。还有什么我应该补充的会有所帮助的吗?
slm 2013年

7

在使用 Django Wiki 页面Newbie错误的SQLite3 部分中,从Django说出“无法打开数据库文件”

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

在此处复制/粘贴链接的相关部分。
Christophe De Troyer

这是一个赞!:)
Christophe De Troyer

5

在我的测试环境中,将可操作用户添加到www-data组中的效果很好。另外,为了更加安全,我将sqlite3.db文件放入单独的子文件夹中

数据库文件应归www-data所有

sudo chown www-data mysite/db_sqlite3/
sudo chown www-data mysite/db_sqlite3/my.db

我的运营用户hape成为www-data组的成员:

sudo usermod -a -G www-data hape

允许数据库文件对组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

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

./manage.py runserver

也。


1

从SO问题中借来的:https : //stackoverflow.com/questions/4283132/apache-instance-user-permission-issue

假设文件由apache用户拥有以启动:

% chown -R apache.apache /var/www/mysite

设置ACLs为用户/组PI:

% setfacl -d -m u:pi:rwx /var/www/mysite
% setfacl -d -m g:pi:rwx /var/www/mysite

% getfacl /var/www/mysite
# file: /var/www/mysite
# owner: apache
# group: apache
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:pi:rwx
default:group::r-x
default:group:pi:rwx
default:mask::rwx
default:other::r-x

您可以知道在权限位上有一个ACLwith ls -l,后跟“ +”:

# ls -la /var/www
drwxr-xr-x   3 apache   apache   80 26. Nov 12:43 .
drwxrwxrwt  15 root     root 360 26. Nov 12:40 ..
drwxrwxr-x+  2 apache   apache   40 26. Nov 12:43 mysite

将整个django项目的所有者/组设置为apache进程是一个坏主意,无需给予不必要的特权。
benjaoming

1

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

对于Windows 7、8.1、10,Server 2012等,请遵循Bonobo安装说明

允许IIS用户修改C:\ inetpub \ wwwroot \ Bonobo.Git.Server \ App_Data文件夹。

为此:

  1. 选择“ App_Data”文件夹的“属性”,
  2. 转到安全标签,
  3. 点击修改,
  4. 选择IIS用户(在我的情况下为IIS_IUSRS),然后添加“修改和写入”权限,
  5. 使用“应用”按钮确认这些设置。

0

开发服务器需要以在数据库文件夹上具有写权限的同一用户身份运行,因此,如果您最初以root用户身份创建数据库,则在运行时需要以root用户身份运行:

python manage.py runserver

尽管从技术上讲是正确的,但是按照root一个可怕的想法来chown运行服务器
voretaq7 2012年

0

在工作目录中创建一个子目录

mkdir db-folder 

在子目录中创建sqlite数据库

sqlite3 db-folder/db.db

在debain或centOS中的apache中将子目录的所有者更改为www-data

chown -R www-data db-folder

并抓住一杯冰镇啤酒吧。

P / S:检查过程是否成功

ls -l data-folder

你应该看到这样

-rw-r--r-- 2 www-data root 4096 Jun 18 01:38 data-folder

如果您要发布答案,请提供与同一问题的其他答案完全不同的答案。
masegaloeh 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.