Django初学者问题:manage.py dbsync

时间:2009-07-05 20:30:58

标签: django

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

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

Traceback (most recent call last):
  File "manage.py", line 11, in 
    execute_manager(settings)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/__init__.py", line 340, in execute_manager
    utility.execute()
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/__init__.py", line 295, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 192, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 219, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/base.py", line 348, in handle
    return self.handle_noargs(**options)
  File "/usr/local/lib/python2.6/dist-packages/django/core/management/commands/syncdb.py", line 51, in handle_noargs
    cursor = connection.cursor()
  File "/usr/local/lib/python2.6/dist-packages/django/db/backends/__init__.py", line 56, in cursor
    cursor = self._cursor(settings)
  File "/usr/local/lib/python2.6/dist-packages/django/db/backends/sqlite3/base.py", line 145, in _cursor
    self.connection = Database.connect(**kwargs)
sqlite3.OperationalError: unable to open database file

有人对我的问题有任何疑问吗?

9 个答案:

答案 0 :(得分:21)

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

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

即。而不是:

~/project/mydata.db

使用

/home/user/project/mydata.db

答案 1 :(得分:17)

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


漫长而无聊的解释

如果您通过运行来启动项目:

django startproject epic_project

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

  • /路径/到/ 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:无法打开数据库文件”

答案 2 :(得分:9)

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

sudo python manage.py syncdb

相反,它有用吗?

答案 3 :(得分:5)

出于Google的考虑:

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

答案 4 :(得分:3)

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

答案 5 :(得分:2)

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

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,您可能必须使用replace方法。 (不确定..但你可以尝试如下)

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

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

答案 6 :(得分:0)

与user104264的答案类似 - 不同的观点......

目前跟随YouTube tutorial我遇到了同样的错误。在virtualenv django项目目录中运行manage.py时似乎对我来说...虚拟环境的路径... / django_project /,/ myapp / setting.py里面的数据库名称只是'storage.db'所以

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

created ...虚拟环境项目的路径... / django_project / storage.db

- 比尔

答案 7 :(得分:0)

如果要指定db文件的完整路径并且仍然存在问题,请尝试在字符串前放置一个r。

即。

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

答案 8 :(得分:0)

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