代码之家  ›  专栏  ›  技术社区  ›  Cristian

django初学者问题:manage.py dbsync

  •  12
  • Cristian  · 技术社区  · 15 年前

    我在运行ubuntu 9.0432b,从synaptics得到了django。 my 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 回复  |  直到 8 年前
        1
  •  21
  •   JosefAssad    15 年前

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

    如果你是,试着把它改成绝对路径。

    即,代替:

    ~/project/mydata.db
    

    使用

    /home/user/project/mydata.db
    
        2
  •  17
  •   JobJob    12 年前

    如果数据库名称与项目名称相同,也会发生这种情况。要解决这个问题,只需更改数据库的名称,例如在名称中添加一个.db。因此,如果您在Stest.Py中的数据库名为“EpsiSjp项目”,则将其更改为“EpsijPosij.db”。


    冗长乏味的解释 :

    如果通过运行启动项目:

    django startproject epic_project
    

    您的文件夹结构如下:

    • /路径/到/史诗项目/
      • 管理学
      • Epic_项目/
        • 设置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来说,它是一个目录而不是一个db,所以它会哭,django将这些眼泪显示为“sqlite3.operational错误:无法打开数据库文件”

        3
  •  9
  •   oscarkuo    15 年前

    可能是权限问题,您的用户是否有足够的权限对文件夹进行写入?例如,如果

    sudo python manage.py syncdb
    

    相反,它有效吗?

        4
  •  5
  •   Raj    13 年前

    为了谷歌:

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

        5
  •  3
  •   Simon Dugré Ratna Halder    12 年前

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

        6
  •  2
  •   BigFatProgrammer    9 年前

    两天前我也有同样的问题。我通过将数据库字典(settings.py)中的“name”设置为绝对路径来解决这个问题。 例如。

    设置Py

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

    在这里,您可以在Stung.Py的顶部设置数据库路径。 (不确定这是否适用于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('\\', '/'))
    

    数据库路径也是如此。 如果我错了,请纠正我。

        7
  •  0
  •   Bill Thayer    11 年前

    类似于用户104264的回答-不同的角度…

    当前正在跟踪 YouTube tutorial 我也犯了同样的错误。在运行VirtualEnv Django项目目录……到虚拟Env…/DjangoProProject的路径时,在我看来,内部的数据库名称/MyAPP/SETIGNPS.PY只是“存储.db”

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

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

    -比尔

        8
  •  0
  •   agconti    11 年前

    如果指定DB文件的完整路径,但仍有问题,请尝试在字符串前加上R。

    IE.

    r'C:\home\usr\mysite\sqlite3.db'
    
        9
  •  0
  •   Tom    10 年前

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