Django部署之后出现Can’t open database file问题的解决

实习了这么长时间,自己一手打造的globalview也渐渐羽翼丰满。好像借来的那台共享服务器(其实就是脚边的一台主机)已经不能完全支持了,所以在老大的要求下,部门给我们又分配了一台单独的主机(orz…还是一样的主机),所以需要将原来的项目迁移到新环境下。之前研究了的wsgi部署,又要重新来过。其实,一开始我觉得会很快,因为已经部署过一次,而且运行的比较完美。可是,事实是残酷的。。。

当我把所有的东西都按照步骤完成好之后,在browser里敲入url,停顿数微妙之后,就傻眼了。。。(其实,如果你首页上不涉及到数据库的操作,也不会这么快傻眼,起码一开始还会认为自己不费吹灰之力部署成功了,当然是否涉及数据库是后话。)由于把debug设置成true,所以看到了错误的信息,一行“Can’t open database file”,让我纠结不已。我以为肯定是数据库那边的算法出现了问题,是不是没有考虑到什么死锁问题,然后又去把算法看了个够,能完善的都完善了,可是重启apache服务器之后,刷新页面还是同样的问题。说实话,我纠结在算法这里快1个多小时。。。

后来也不知道是怎么想的,想到了会不会是权限的问题,运行apache的用户(我们为apache服务单独建立了user,项目需要)没有权限去写操作数据库文件?于是,非常不安全的将数据库文件的权限改成了777,但是问题还是没能解决。最后,实在没有办法了,采用了最笨的方法,但也是最有效的方法:将远服务器上运行成功的文件目录下的文件的权限全部copy到现服务器目录文件。发现只有两个地方不同:一个就是刚刚改的数据库文件(我们用的是sqlite,为的是便捷,其实效能真心不给力);还有一个是项目的主文件夹。于是,我尝试着把主文件夹目录权限也改成了777,这一次终于运行成功。撒花啊~~~

下面,对这个问题做个总结:
(下面是从django文档中找到的:为什么早点没找到,解决了就搜到了。。。)
Django says “Unable to Open Database File” when using SQLite3
Problem

You’re using SQLite3, your DATABASE_NAME is set to the database file’s full path, the database file is writeable by Apache, but you still get the above error.
Solution

Make sure Apache can also write to the parent directory of the database. SQLite needs to be able to write to this directory.

Make sure each folder of your database file’s full path does not start with number, eg. /www/4myweb/db (observed on Windows 2000).

If DATABASE_NAME is set to something like ‘/Users/yourname/Sites/mydjangoproject/db/db’, make sure you’ve created the ‘db’ directory first.

Make sure your /tmp directory is world-writable (an unlikely cause as other thing on your system will also not work). ls /tmp -ald should produce drwxrwxrwt ….

Make sure the path to the database specified in settings.py is a full path.

简单的说,也就是对项目执行用户来说数据库文件要有读写权限,同时包含数据库文件的文件夹也要有读写权限。其实也不一定要777,在我们的情况下只要644就可以了(我们项目的所属user和执行user相同),而且既保证了项目的可执行性,还兼顾到了安全性。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.