sqlite3.OperationalError: 无法打开数据库文件

63

在Django中设置服务器时,我遇到了这个错误。它是sqlite3,这意味着它应该创建.db文件,但似乎没有这样做。我已经指定了SQLite作为后端以及一个放置它的绝对文件路径,但没有运气。

这是一个bug还是我做错了什么?(我在想,Ubuntu中指定的绝对文件路径是否不同?)

这是我的settings.py文件开头:

# Django settings for OmniCloud project.

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
# ('Your Name', 'your_email@example.com'),
)

MANAGERS = ADMINS

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
    'NAME': '~/Harold-Server/OmniCloud.db',                      # Or path to database file if using sqlite3.
    'USER': '',                      # Not used with sqlite3.
    'PASSWORD': '',                  # Not used with sqlite3.
    'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
    'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
}
}

4
很遗憾原始错误信息没有包含引起错误的文件名,这可能会有所帮助。 - Hartmut Pfarr
8个回答

88

Django 新手错误

问题:你正在使用 SQLite3,DATABASE_NAME 设置为数据库文件的完整路径,数据库文件由 Apache 可写,但仍然出现上述错误。

解决方法:确保 Apache 还可以写入数据库所在目录的父目录。SQLite 需要能够写入该目录。

确保数据库文件完整路径中的每个文件夹都不以数字开头,例如 /www/4myweb/db(在 Windows 2000 上观察到)。

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

确保你的 /tmp 目录是可被所有用户写入的(这不太可能是原因,因为你的系统上其他东西也将无法工作)。ls /tmp -ald 应该显示 drwxrwxrwt...。

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

还要确保文件存在于你期望的路径下。


在Linux命令行中,我应该如何更改Apache的权限? - Chris
你不需要更改Apache的权限,而是需要更改文件和文件夹的权限,以便Apache可以在正确的位置读取和写入。这里有一个关于chmod的指南http://catcode.com/teachmod/,它是Linux中更改权限的方法。但实际上只需要执行chmod +rw folder_name即可。 - John
1
谢谢,"确保您首先创建了'db'目录"是一个非常好的提示 :-) - Hartmut Pfarr
John,如果我有机会到你所在的城市,我请你吃午餐。 - Yitzhak
chmod o+w .在DB文件夹中为我解决了这个问题。 - lionello
如果你正在使用Windows系统,确保你的数据库路径是用双反斜杠写的(建议使用os.path方法):'C:\\django\\sqlite\\django.db' 或者 r'C:\django\sqlite\django.db'请确保路径中没有特殊字符,如“éè”或“(”等。如果你在Windows上使用时出现间歇性的错误信息,请确保你的安全软件(反恶意软件)没有打开(并锁定)你的数据库文件以检查恶意软件的存在。 - blue_chip

21

我遇到了完全相同的问题。这是我的设置,可以解决问题。

'ENGINE': 'django.db.backends.sqlite3', 
'NAME': '/home/path/to/your/db/data.sqlite3'

如果使用sqlite3,其他设置将保持相同/默认。
并且您需要创建data.sqlite3。


11

你没有指定绝对路径 - 你使用了一个快捷方式,~,在这种情况下可能无法正常工作。请改用 /home/yourusername/Harold-Server/OmniCloud.db


用户名是服务器的名称还是因为我以root身份登录,所以是root? - Chris
永远不要使用root登录。为Django网站设置一个用户,或者使用Apache用户(通常是www-data)。 - Daniel Roseman
好的,我正在通过SSH访问Linode服务器,并添加了一个名为Ned的用户。所以我需要从GitHub上拉取repo,然后在Ned上运行它? - Chris

8

您需要使用完整路径而不是~/

在您的情况下,可以使用类似于/home/harold/Harold-Server/OmniCloud.db这样的路径。


没错。波浪线“~”是一个在应用程序内无法识别的bash快捷方式。感谢修复! :) - undefined

6
在我的情况下,sqlite数据库文件db.sqlite3存储在apache的DocumentRoot中。 因此,即使设置了以下权限,它也无法工作:
sudo chown www-data:www-data /path/to/db-folder
sudo chown www-data:www-data /path/to/db-folder/sqlite-db.db

最后,当我将db.sqlite3移动到新创建的文件夹dbfolder中,并为上述内容授权时,它可以正常工作。

这对我来说非常完美,从根用户开始 - 使用Flask应用程序从项目目录内连接到数据库。效果很好 - 只需要让Apache能够与数据库通信即可。 - user7179686

2

我曾经在使用Apache时遇到过这个问题,后来发现在我的.env文件中使用sqlite3数据库的绝对路径////而不是相对路径///可以解决这个问题。同时需要确保上述提到的所有权限和所有权都是必要的。


1

使用这种类型,它适用于我。Windows 7上使用Python 2.7和Django 1.5。

'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'C:\\tool\\mysite\\data.db',

希望它能正常工作...


0
在同一个案例中,问题出在空的写入权限上。
sudo chmod -R o+w ./dir/

你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接