为什么我得到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 

让我知道如果一个堆栈跟踪是必要的。

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

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

    在我的情况下,运行这个命令解决了这个问题:

     chown www-data. . 

    Django的“无法打开数据库文件”时使用SQLite3新手 部分 错误 Django wiki 页面 :

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

    我的解决scheme更像是这样。 我真的不想改变这个目录的所有权。 (主要是因为我使用pi用户做像git的东西)

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

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

    其中pi是我创build所有文件的用户(是的,这是一个覆盆子pi)

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

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

    这使组写入访问必要的文件,并将www数据用户添加到pi组。

    注意:如果你有日志logging,你需要为django日志文件做这个,否则apache不会太喜欢它。

    将操作用户添加到www-data组在我的testing环境中运行良好。 另外,我已经把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)读取和写入数据库,而无需授予项目根文件夹,另一方面,应用程序可以通过操作在开发模式下运行用户hape,例如

     ./manage.py runserver 

    也。

    借用从这个问题: https : //stackoverflow.com/questions/4283132/apache-instance-user-permission-issue

    假设文件由apache用户拥有开始:

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

    设置用户/组pi的ACLs

     % setfacl -d -mu:pi:rwx /var/www/mysite % setfacl -d -mg:pi:rwx /var/www/mysite % getfacl /var/www/mysite # file: /var/www/mysite # owner: apache # group: apache user::rwx group::rx other::rx default:user::rwx default:user:pi:rwx default:group::rx default:group:pi:rwx default:mask::rwx default:other::rx 

    你可以通过ls -l来判断是否存在一个ACL ,这个权限位的结尾是'+':

     # 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 

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

    对于Windows 7,8.1,10和Server 2012等,请按照Bonobo的安装说明进行操作 :

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

    要做到这一点:

    1. selectApp_Data文件夹的属性,
    2. 去安全标签,
    3. 点击编辑,
    4. selectIIS用户(在我的情况下IIS_IUSRS),并添加修改和写入权限,
    5. 使用应用button确认这些设置。

    开发服务器需要以与在数据库文件夹上写入perm相同的用户身份运行,所以如果最初以root用户身份创build数据库,则在运行时需要root用户身份:

     python manage.py runserver 

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

     mkdir db-folder 

    在子目录中创buildsqlite数据库

     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 

    只需写sudo sqlite3 databaseFilename.sql ,它的工作