Django“无法打开数据库文件”

Posted

技术标签:

【中文标题】Django“无法打开数据库文件”【英文标题】:Django is "unable to open database file" 【发布时间】:2011-03-17 20:48:22 【问题描述】:

运行“python manage.py syncdb”后,我收到一条错误消息“无法打开数据库文件”。

这是我的 settings.py 中的重要部分:

DATABASE_ENGINE = 'sqlite3'    # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = 'apps.db'      # Or path to database file if using sqlite3.
DATABASE_USER = ''             # Not used with sqlite3.
DATABASE_PASSWORD = ''         # Not used with sqlite3.
DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.

这里是“apps.db”的权限:

-rw-r--r-- 1 root root 33792 19. Jul 10:51 apps.db

我的 django 服务器是从 apache 调用的...我不知道它是否与权限有关,但是将 apps.db 的所有者更改为“www-data”也不起作用

[编辑]

为了确保 www-data 可以访问所有这些,我做了以下操作:

做了以下事情:

chown -R www-data apps
rm apps.db
su www-data
python manage.py syncdb

但是还是不行:(

【问题讨论】:

确保 www-data 可以通过整个路径到达您的 db,而不仅仅是读取/写入 db 文件。 【参考方案1】:

只需用 .sqlite3 扩展名重命名数据库文件,这对我有用。

【讨论】:

【参考方案2】:

要更改父目录的权限,您可以使用以下命令集:

检查 apache v2 的 apache 进程:

ps -ef | grep apache | grep -v grep

用户/组是 www-data

chgrp www-data /path/to/mydir
chmod g+w /path/to/mydir

参考:https://askubuntu.com/questions/58725/how-do-we-know-that-a-directory-is-apache-writable

【讨论】:

【参考方案3】:

对于我的 linux 系统,我必须授予进程所有者对 db.sqlite3 和包含它的 目录 的写入权限!您可以改为 setfacl !例如:(https://serverfault.com/questions/484818/best-way-to-set-up-permissions-with-nginx-php-fpm-on-shared-hosting)。

(py2.7)[me@server django-project-container]$ ls -la djangoproject/

drwxrwxr-x. 6 root nginx  4096 Jun 14 01:05 .
drwxr-xr-x. 6 root root  4096 Jun 13 23:47 ..
-rwxrwxrwx. 1 root nginx 49152 Jun 14 01:05 db.sqlite3

【讨论】:

【参考方案4】:

Solution from NewbieMistakes

确保 Apache 也可以写入 数据库。 SQLite 需要能够写入此目录。

确保您的数据库文件的完整路径的每个文件夹都没有启动 带数字,例如。 /www/4myweb/db(在 Windows 2000 上观察)。

如果 DATABASE_NAME 设置为类似 '/Users/yourname/Sites/mydjangoproject/db/db',确保你已经 首先创建了 'db' 目录。

确保您的 /tmp 目录是全局可写的(不太可能的原因是 您系统上的其他东西也将不起作用)。 ls /tmp -ald 应该 产生 drwxrwxrwt ....

确保 settings.py 中指定的数据库路径是完整的 路径。

【讨论】:

父目录权限不明显(对我来说);谢谢。 还有一个FAQ条目here。 那么我真的应该在包含数据库的目录上触发chmod 777 吗?【参考方案5】:

我通过将 DATABASE_NAME 更改为绝对路径解决了错误:/var/www/apps/apps.db

在 Windows 机器上,反斜杠应转义为:C:\\path\\to\\database\\database_name.db

【讨论】:

如果我试图通过网络访问数据库并且路径以 "\\MyMachine\..." 开头,它转换为 "\\\\MyMachine\\..." 怎么办。然后我无法打开连接,我得到“无法打开数据库文件”。即使数据库在我的机器上,我也只是尝试以不同的方式访问它。【参考方案6】:

嗯,我回答了这个问题。 http://goo.gl/KAuXz

我遇到了完全相同的问题。这是我的设置。

'ENGINE': 'django.db.backends.sqlite3', 
'NAME': '/home/neo/django/db/data.sqlite3'

sqlite3 的其他设置将相同/默认。

【讨论】:

【参考方案7】:

DATABASE_NAME 已弃用。您必须使用当前支持的格式。 即

DATABASES = 
'default': 
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': 'C:/ispdb.sqlite',
    'USER': '',
    'PASSWORD': '',
    'HOST': '',
    'PORT': ''


还可以查看 django 网站上已弃用的其他设置。:))

【讨论】:

以上是关于Django“无法打开数据库文件”的主要内容,如果未能解决你的问题,请参考以下文章

OperationalError at / 无法打开数据库文件偶尔出现

iphone sqlite'有时无法打开数据库文件'

FMDB:错误 14,无法打开数据库文件

SQLite 无法打开数据库文件:Laravel + Windows

SQLite - 无法打开数据库文件

Sqlite 错误无法打开数据库文件