2009-07-05 15 views
11

Estoy ejecutando ubuntu 9.04 32b y obtuve django de Synaptics. Mi settings.py está configurado para una base de datos sqlite3.Django para principiantes problema: manage.py dbsync

Yo he pasado por esto tutorial y obtuve el siguiente error al intentar ejecutar el comando 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 

No Alguien tiene una pista sobre mi problema?

Respuesta

9

podría ser un problema de permiso, ¿su usuario tiene suficiente derecho a escribir en la carpeta? por ejemplo, si lo hace

sudo python manage.py syncdb 

en su lugar, ¿funciona?

+0

esto fue muy útil, gracias – RejeeshChandran

21

En settings.py ¿está utilizando una ruta de acceso relativa al archivo sqlite?

Si lo es, intente cambiar eso a una ruta absoluta.

es decir, en lugar de:

~/project/mydata.db 

uso

/home/user/project/mydata.db 
+0

Esto resuelve mi problema. Thx. –

+2

Esto es casi siempre el problema. Python no amplía la ruta cuando las lee. – MattK

5

Por el amor de Google:

El camino a la base de datos debe ser la ruta completa al archivo --- no sólo el directorio donde vive el archivo

+0

¿No es esto lo que JosefAssad sugirió en [su respuesta] (// stackoverflow.com/a/1084782/5420829)? –

3

Tuve el mismo problema en Windows luego me di cuenta de que syncdb no crearía la carpeta especificada si no existiera. Había especificado c:/mysite/db/sqlite3.db en la configuración, pero la carpeta /db/ no existía. Lo creó en la terminal y luego volvió a ejecutar syncdb con éxito.

17

Esto también puede ocurrir si el nombre de su base de datos es el mismo que el nombre de su proyecto. Para solucionarlo, simplemente cambie el nombre de su db, por ejemplo, agregando un .db al NOMBRE. Así que si su nombre de la base de settings.py era 'epic_project' cambia a 'epic_project.db'


explicación larga y aburrida:

Si se inicia el proyecto mediante la ejecución:

django startproject epic_project 

la estructura de carpetas será así:

  • /ruta/a/epic_project/
    • manage.py
    • epic_project/
      • settings.py

si a continuación, en la configuración.py se establece su base de datos como:

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

cuando

python manage.py syncdb 

carreras que intenta abrir o crear un archivo db sqlite en/ruta/a/epic_project/epic_project, pero hay un directorio de allí, entonces dice "oh ok el camino ya existe, abrámoslo como sqlite db", desafortunadamente para sqlite es un directorio y no un DB, entonces llora y django te presenta estas lágrimas como "sqlite3.OperationalError: no se puede abrir" archivo de base de datos "

+0

más 1 para el humor – Rel

0

Similar a la respuesta del usuario104264 - perspectiva diferente ...

Actualmente después del YouTube tutorial tuve el mismo error. Me parece mientras ejecuto el manage.py en un directorio de proyecto django virtualenv ... ruta a env virtual .../django_project /, el nombre de la base de datos dentro /myapp/settings.py era simplemente 'storage.db' así que

(django-v) ... camino al proyecto env virtuales .../django_project /> python manage.py syncdb

creado ... camino al proyecto env virtuales .../django_project/storage.db

-Bill

0

Si está especificando una ruta completa al archivo db y todavía tiene problemas, intente poner una r antes de la cadena.

es decir.

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

Eso significa una expresión regular, pero el problema que está resolviendo es el hecho de que Python no le gusta las barras invertidas simples. Estarías mejor con ''C: \\ home \\ usr \\ mysite \\ sqlite3.db'' – Tom

+1

@Tom, no significa una expresión regular. Le dice a python que lo trate como un * literal de cadena sin formato *: http: // stackoverflow.com/a/2081708/2259303 – agconti

+0

Duh, mi mal. El 99% del tiempo que lo uso es para las URL de Django, así que lo tengo grabado en mi cabeza de esa manera. Lo siento. – Tom

0

El problema estaba corriendo en cuestión fue un arranque en algunas operaciones de búsqueda de los modelos se están realizando en la importación (fuera de cualquier clase o función). Per the docs, esta es una mala idea.

2

Tuve el mismo problema hace dos días. Lo resolví configurando 'NAME' en el diccionario DATABASE (settings.py) en la ruta absoluta. Por ejemplo.

settings.py

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

aquí se puede establecer el DATABASE_PATH en la parte superior de la settings.py como tal (No estoy seguro si esto funcionará para ventanas)

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')) 

Para Windows es posible que deba usar el método de reemplazo. (No estoy seguro ... pero puedes probarlo de la siguiente manera)

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

Igual va para DATABASE_PATH. PS. Corrígeme si estoy equivocado.