Django初学者问题:manage.py dbsync

Posted

技术标签:

【中文标题】Django初学者问题:manage.py dbsync【英文标题】:Django beginner problem: manage.py dbsync 【发布时间】:2010-11-08 06:11:54 【问题描述】:

我正在运行 ubuntu 9.04 32b,并从 Synaptics 获得了 django。 我的 settings.py 是为 sqlite3 数据库配置的。

我已经通过这个tutorial 并在尝试运行命令python manage.py syncdb 时遇到以下错误:

回溯(最近一次通话最后): 文件“manage.py”,第 11 行,在 执行管理器(设置) 文件“/usr/local/lib/python2.6/dist-packages/django/core/management/__init__.py”,第 340 行,在 execute_manager 实用程序.execute() 文件“/usr/local/lib/python2.6/dist-packages/django/core/management/__init__.py”,第 295 行,在执行 self.fetch_command(子命令).run_from_argv(self.argv) 文件“/usr/local/lib/python2.6/dist-packages/django/core/management/base.py”,第 192 行,在 run_from_argv self.execute(*args, **options.__dict__) 文件“/usr/local/lib/python2.6/dist-packages/django/core/management/base.py”,第 219 行,在执行 输出 = self.handle(*args, **options) 文件“/usr/local/lib/python2.6/dist-packages/django/core/management/base.py”,第 348 行,在句柄中 返回 self.handle_noargs(**options) 文件“/usr/local/lib/python2.6/dist-packages/django/core/management/commands/syncdb.py”,第 51 行,在 handle_noargs 游标 = 连接。游标() 光标中的文件“/usr/local/lib/python2.6/dist-packages/django/db/backends/__init__.py”,第 56 行 光标 = self._cursor(设置) _cursor 中的文件“/usr/local/lib/python2.6/dist-packages/django/db/backends/sqlite3/base.py”,第 145 行 self.connection = Database.connect(**kwargs) sqlite3.OperationalError:无法打开数据库文件

有人知道我的问题吗?

【问题讨论】:

【参考方案1】:

两天前我遇到了同样的问题。我通过将 DATABASE 字典(settings.py)中的“NAME”设置为绝对路径来解决它。 例如。

settings.py

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

在这里你可以在 settings.py 的顶部设置 DATABASE_PATH (不确定这是否适用于 Windows)

SETTINGS_DIR = os.path.dirname(__file__)
PROJECT_PATH = os.path.abspath(os.path.join(SETTINGS_DIR, os.pardir))
DATABASE_PATH = os.path.abspath(os.path.join(PROJECT_PATH, 'your-database-name'))

对于 Windows,您可能必须使用替换方法。 (不确定..但你可以尝试如下)

PROJECT_PATH = os.path.abspath(os.path.join(SETTINGS_DIR, os.pardir).replace('\\', '/'))

DATABASE_PATH 也是如此。 PS。如果我错了,请纠正我。

【讨论】:

【参考方案2】:

我遇到的问题是一个引导问题,在导入时(在任何类或函数之外)进行了一些模型查找。 Per the docs,这是个坏主意。

【讨论】:

【参考方案3】:

如果您指定了 db 文件的完整路径,但仍有问题,请尝试在字符串前添加 r。

即。

r'C:\home\usr\mysite\sqlite3.db'

【讨论】:

这表示正则表达式,但您要解决的问题是 Python 不喜欢单个反斜杠。使用'C:\\home\\usr\\mysite\\sqlite3.db' 会更好 @Tom 它并不表示正则表达式。它告诉 python 将其视为 原始字符串文字:***.com/a/2081708/2259303 呃,我的错。我使用它的 99% 时间都是用于 Django url,所以我已经把它卡在了我的脑海里。对不起。【参考方案4】:

与 user104264 的回答类似 - 不同的角度...

目前关注YouTube tutorial 我遇到了同样的错误。在我看来,在 virtualenv django 项目目录中运行 manage.py ...虚拟环境的路径 .../django_project/ 时,/myapp/settings.py 中的数据库名称只是“storage.db”所以

(django-v)...虚拟环境项目的路径.../django_project/>python manage.py syncdb

创建了...虚拟环境项目的路径.../django_project/storage.db

-比尔

【讨论】:

【参考方案5】:

如果您的数据库名称与项目名称相同,也会发生这种情况。要修复它,只需更改数据库的名称,例如通过将 .db 添加到 NAME。因此,如果您在 settings.py 中的 DATABASE NAME 是“epic_project”,请将其更改为“epic_project.db”


冗长乏味的解释

如果你通过运行开始你的项目:

django startproject epic_project

您的文件夹结构将如下所示:

/path/to/epic_project/ manage.py epic_project/ settings.py

如果然后在您的 settings.py 中将您的数据库设置为:

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

什么时候

python manage.py syncdb 

运行它会尝试在 /path/to/epic_project/epic_project 打开或创建一个 sqlite db 文件,但是那里有一个目录,所以它说“哦,好的路径已经存在,让我们将它作为一个 sqlite db 打开” ,不幸的是对于 sqlite 它是一个目录而不是数据库,所以它会哭泣并且 django 将这些眼泪呈现给你“sqlite3.OperationalError:无法打开数据库文件”

【讨论】:

幽默加 1【参考方案6】:

我在 Windows 上遇到了同样的问题,然后意识到如果指定的文件夹不存在,syncdb 将不会创建它。我在设置中指定了c:/mysite/db/sqlite3.db,但/db/ 文件夹不存在。在终端中创建它然后成功重新运行syncdb。

【讨论】:

【参考方案7】:

为了谷歌:

数据库的路径必须是文件的完整路径 --- 而不仅仅是文件所在的目录。

【讨论】:

这不是 JosefAssad 在their answer 中建议的吗?【参考方案8】:

在 settings.py 中你使用的是 sqlite 文件的相对路径吗?

如果是,请尝试将其更改为绝对路径。

即而不是:

~/project/mydata.db

使用

/home/user/project/mydata.db

【讨论】:

这几乎总是问题所在。 Python 在读取这些文件时不会进行路径扩展。【参考方案9】:

可能是权限问题,您的用户是否有足够的权限在文件夹上写入?例如,如果你这样做

sudo python manage.py syncdb

相反,它有效吗?

【讨论】:

以上是关于Django初学者问题:manage.py dbsync的主要内容,如果未能解决你的问题,请参考以下文章

Django 命令行工具django-admin.py与manage.py

什么时候应该使用 django-admin.py 和 manage.py?

Django 无法运行 manage.py

为啥 Django 应用程序需要 `manage.py` 而不是使用 `__init__ py`?

运行 manage.py 文件时 Django 显示错误

Django 中 python manage.py makemigrations 与 python manage.py migrate