it-swarm.cn

为什么出现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

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

65
Nick Bolton

啊哈,偶然发现 一篇文章 对此进行了解释。另外Django)在其 NewbieMistakes 页面上有信息。

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

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

Sudo chown www-data .
80
Nick Bolton

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

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

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

pi是我在其中创建所有文件的用户。(是的,这是Raspberry 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不会非常喜欢它。

7
SpiRail

中,当使用SQLite3(section时,Django说``无法打开数据库文件'' )新手错误Django Wiki page

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

在我的测试环境中,将可操作用户添加到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)以读写方式访问数据库,而无需授予项目根文件夹的授权,并且-另一方面,该应用程序可以由开发人员以开发模式运行用户希望,例如.

./manage.py runserver

也。

5
Hartmut P.

从SO问题: https://stackoverflow.com/questions/4283132/Apache-instance-user-permission-issue

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

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

为用户/组pi设置ACLs

% 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

您可以分辨出ACLls -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
1
slm

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

对于Windows7、8.1、10,Server 2012等,请遵循 Bo黑猩猩安装说明

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

为此:

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

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

python manage.py runserver
0
Kilizo

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

mkdir db-folder 

在子目录中创建sqlite数据库

sqlite3 db-folder/db.db

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

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
0
brotich