Django:无法打开数据库文件(这是路径名问题吗?)

Posted

技术标签:

【中文标题】Django:无法打开数据库文件(这是路径名问题吗?)【英文标题】:Django: unable to open database file (is this a pathname issue?) 【发布时间】:2016-05-29 06:32:39 【问题描述】:

在过去的几天里,我一直在尝试解决这个错误。当我运行我的脚本时,我收到了 Django“OperationalError:无法打开数据库文件”错误。 根据我在 this SO question 和 this similar SO question(以及许多 Google 搜索)上找到的内容,最常见的问题是有人使用相对路径而不是绝对路径,或者有一些其中一个字符串中的某种错字。

这是与我的路径相关的代码

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DATA_FILE = os.path.join(BASE_DIR, 'data', 'mydbtester.db')

...

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': DATA_FILE,
    

据我了解,... 上面的代码应该是获取目录的绝对路径从当前文件向上两个目录,然后将其与data 目录和数据库连接起来名称和文件扩展名。我已经检查过这个文件是否存在,并且它确实存在于指定的位置;名称完全匹配。我也绝对确定当前用户拥有此文件的权限。

我也无法migrate 数据库,出现完全相同的错误。

有谁知道为什么会导致 OperationalError,或者是否还有其他原因?

注意:我在 Docker 容器中运行时也遇到了这个问题。

非常感谢。

编辑:

在 DATA_FILE 声明下添加print(DATA_FILE) 语句后,BASE_DIR 似乎只在需要上移两个目录时才上移一个目录。为了查看这是否是问题所在,我将data 目录下移了一个目录,然后它就开始工作了。 然而,这不是我的项目的结构方式。有什么帮助可以让BASE_DIR 再引用一个目录吗?

【问题讨论】:

你能在print DATA_FILE那里看看是不是你所期望的吗? @DanielRoseman 如果我在那里添加print(DATA_FILE) 行,它会打印两次DATA_FILE 的路径,然后决定再次中断。 但是路径正确吗? 天哪。不,实际上。我什至没有注意到这一点。似乎它只是向上移动一个目录而不是BASE_DIR 行中的两个。有什么想法吗? 【参考方案1】:

第一个dirname 从字面上获取文件所在的目录名称,而不是其父目录。

你可能应该这样做:

DATA_DIR = os.path.abspath(os.path.join(BASE_DIR, '..', 'data', 'mydbtester.db'))

【讨论】:

完美,这在将文件移回之前的位置后有效。谢谢!

以上是关于Django:无法打开数据库文件(这是路径名问题吗?)的主要内容,如果未能解决你的问题,请参考以下文章

django 制作web网站,动态页面数据已更新,但是无法刷新,这是怎么回事?是页面缓存吗?

python Django1.3 建立网站,无法加载css

路径名太长无法打开?

Python的文件上传

PHP警告:无法打开流:没有这样的文件或目录,文件路径错误

调整 Django URL 中的正则表达式以匹配文件路径