Проблема начинающего Django: manage.py dbsync

Я запускаю ubuntu 9.04 32b и получил django из Synaptics. Мой 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

У кого-нибудь есть ключ к моей проблеме?

Ответ 1

В settings.py вы используете относительный путь к sqlite файлу?

Если вы, попробуйте изменить это на абсолютный путь.

то есть. вместо:

~/project/mydata.db

использование

/home/user/project/mydata.db

Ответ 2

Это также может произойти, если ваше имя базы данных совпадает с именем вашего проекта. Чтобы исправить это, просто измените имя своего db, например. добавив .db в NAME. Поэтому, если ваше имя DATABASE в файле 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 

запускает его, пытается открыть или создать файл db sqlite в /path/to/epic _project/epic_project, но там есть каталог, поэтому он говорит "oh ok, путь уже существует, пусть он откроется как sqlite db", к сожалению для sqlite это каталог, а не БД, поэтому он плачет, а django представляет эти слезы вам как "sqlite3.OperationalError: невозможно открыть файл базы данных"

Ответ 3

может быть проблемой разрешения, имеет ли ваш пользователь достаточное право писать в папке? например, если вы делаете

sudo python manage.py syncdb

вместо этого он работает?

Ответ 4

В целях:

Путь к базе данных должен быть полным путем к файлу --- не только каталог, в котором находится файл.

Ответ 5

У меня была такая же проблема в Windows, тогда поняли, что syncdb не будет создавать указанную папку, если она еще не существует. Я указал c:/mysite/db/sqlite3.db в настройках, но папка /db/ не существовала. Создал его в терминале, а затем успешно перезапустил syncdb.

Ответ 6

У меня была такая же проблема два дня назад. Я решил это, установив "NAME" в словаре DATABASE (settings.py) на абсолютный путь. Например.

settings.py

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

здесь вы можете установить DATABASE_PATH в верхней части settings.py как таковой (Не уверен, что это будет работать для окон)

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. Исправьте меня, если я ошибаюсь.

Ответ 7

Как и у пользователя user104264 - разные перспективы...

В настоящее время после учебника YouTube у меня была такая же ошибка. Кажется мне во время запуска manage.py в каталоге проектов django virtualenv... путь к виртуальному env.../django_project/, имя базы данных внутри /myapp/settings.py было просто "storage.db", поэтому

(django-v)... путь к виртуальному проекту env.../django_project/" > python manage.py syncdb

создан... путь к виртуальному проекту env.../django_project/storage.db

-Билль

Ответ 8

Если вы указываете полный путь к файлу db и все еще имеете проблемы, попробуйте поместить r перед строкой.

т.

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

Ответ 9

Проблема, с которой я столкнулась, была проблема начальной загрузки, когда некоторые импортные модели выполнялись при импорте (вне любого класса или функции). В документах, это плохая идея.