django.db.utils.OperationalError:无法打开数据库文件

django.db.utils.OperationalError: unable to open database file

我跑的时候

1
python manage.py runserver

我收到这个错误

在get_new_connection中输入文件"/usr/local/lib/python2.7/dist-packages/Django-1.10.1-py2.7.egg/django/db/backends/sqlite3/base.py",第209行
conn = Database.connect(** conn_params)
django.db.utils.OperationalError:无法打开数据库文件

我的settings.py:

1
2
3
4
5
6
7
DATABASES = {
    'default': dj_database_url.config(
        default="sqlite:///{}".format(
            os.path.join(BASE_DIR, 'db/db.sqlite3')
        )
    )
}

从同一个问题中苦苦挣扎了一段时间,我相信我终于找到了解决方案!

1
sudo python manage.py runserver

这对我有用。

我的权限告诉我一切都是应该的。无论如何,我仍然必须在终端的命令开头输入sudo。


我有同样的问题,只是解决了它。确保www-data(或运行Web服务器的任何守护程序)都可以访问db.sqlite3文件以及它的路径。所以:

1
2
3
sudo chown :www-data <project_folder>/
sudo chown :www-data <project_folder>/db.sqlite3
sudo chmod 664 <project_folder>/db.sqlite3


基本上有两个答案,即运行服务器的用户无权打开数据库文件。
你可以尝试解决这个问题:

1
sudo chown $(whoami):$(whoami) /path/to/dir/db/db.sqlite3

或者您没有此文件,可以通过应用migrate命令创建它:

1
./manage.py migrate


对我来说,问题是我有两个设置文件;一个用于生产,一个用于开发。在我的manage.py中,我指定了部署设置文件,忘了将manage.py添加到我的.gitignore,所以当我在本地运行项目时,尝试查找生产数据库时失败了。


只需删除settings.py文件中的第一个数据库即可。

如果删除第一个db,则os.path.join(BASE_DIR, 'db/db.sqlite3'),您将拥有os.path.join(BASE_DIR, 'db.sqlite3')

您的数据库设置将是

1
2
3
4
5
6
7
DATABASES = {
    'default': dj_database_url.config(
        default="sqlite:///{}".format(
            os.path.join(BASE_DIR, 'db.sqlite3')
        )
    )
}

@ whinytween96:我已经看到当sudo用于运行某些命令而不是其他命令时,会出现此问题。您需要与sudo的使用保持一致才能解决此问题。我有数据库问题,我通过再次运行命令修复它,前缀为sudo

  • sudo python manage.py runserver
  • sudo python manage.py makemigrations
  • sudo python manage.py migrate
  • 为我解决了这个问题。