2009-07-05 9 views
11

Sto utilizzando Ubuntu 9.04 32b e ho ricevuto django da Synaptics. My settings.py è configurato per un database sqlite3.Problema del principiante di Django: manage.py dbsync

che ho passato questa tutorial e ottenuto il seguente errore quando si tenta di eseguire il 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 

fare chiunque hanno un indizio sul mio problema?

risposta

9

potrebbe essere un problema di autorizzazione, il tuo utente ha il diritto sufficiente di scrivere sulla cartella? per esempio se lo fai

sudo python manage.py syncdb 

invece, funziona?

+0

questo è stato molto utile, grazie – RejeeshChandran

21

In settings.py stai utilizzando un percorso relativo al file sqlite?

Se lo sei, prova a cambiarlo in un percorso assoluto.

cioè invece di:

~/project/mydata.db 

uso

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

Questo risolve il mio problema. Thx. –

+2

Questo è quasi sempre il problema. Python non esegue l'espansione del percorso quando legge questi. – MattK

5

Per l'amor di Google:

Il percorso del database deve essere il percorso completo del file --- non solo il directory in cui il file vive.

+0

Non è questo ciò che JosefAssad ha suggerito in [la loro risposta] (// stackoverflow.com/a/1084782/5420829)? –

3

Ho avuto lo stesso problema su Windows, quindi mi sono reso conto che syncdb non avrebbe creato la cartella specificata se non esisteva già. Avevo specificato c:/mysite/db/sqlite3.db nelle impostazioni ma la cartella /db/ non esisteva. Lo ha creato nel terminale e poi ha eseguito nuovamente syncdb con successo.

17

Ciò può verificarsi anche se il nome del database è uguale al nome del progetto. Per risolvere il problema basta cambiare il nome del tuo db e.g. aggiungendo un file .db al NOME. Così, se il nome del database in settings.py era 'epic_project' modificando con 'epic_project.db'


spiegazione lunga e noiosa:

Se si avvia il progetto eseguendo:

django startproject epic_project 

la struttura delle cartelle sarà simile a questo:

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

se poi nelle impostazioni.py si imposta il database come:

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

quando

python manage.py syncdb 

corre tenta di aprire o creare un file db sqlite a/path/to/epic_project/epic_project, ma c'è una directory lì, quindi dice "oh ok il percorso esiste già, apriamolo come sqlite db", sfortunatamente per sqlite è una directory e non un DB, quindi piange e django ti presenta queste lacrime come "sqlite3.OperationalError: impossibile aprire file di database "

+0

più 1 per l'umorismo – Rel

0

Simile alla risposta dell'utente104264 - prospettiva diversa ...

Attualmente seguendo lo YouTube tutorial ho avuto lo stesso errore. Mi sembra mentre eseguo manage.py in una directory di progetto django virtualenv ... path to virtual env .../django_project /, il nome del database all'interno di /myapp/settings.py era semplicemente 'storage.db' quindi

(django-v) ... percorso al progetto ENV virtual .../django_project /> python manage.py syncdb

creato ... percorso al progetto ENV virtual .../django_project/storage.db

-Bill

0

Se si specifica un percorso completo al db di file e continui ad avere problemi, prova ponendo r prima della stringa.

ie.

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

Ciò significa un'espressione regolare, ma il problema che stai risolvendo è il fatto che a Python non piacciono i singoli backslash. Starai meglio con ''C: \\ home \\ usr \\ mysite \\ sqlite3.db'' – Tom

+1

@Tom non significa un'espressione regolare. Indica a python di trattarlo come un * grezzo stringa letterale *: http: // stackoverflow.it/a/2081708/2259303 – agconti

+0

Duh, mio ​​male. Il 99% delle volte che lo uso è per gli url di Django, quindi l'ho bloccato nella mia testa in quel modo. Scusate. – Tom

0

Il problema stavo correndo in è stato un problema di bootstrap in cui alcune ricerche modello venivano fatte al momento dell'importazione (al di fuori di qualsiasi classe o funzione). Per the docs, questa è una cattiva idea.

2

Ho avuto lo stesso problema due giorni fa. L'ho risolto impostando il 'NOME' nel dizionario DATABASE (settings.py) sul percorso assoluto. Ad esempio.

settings.py

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

qui è possibile impostare la DATABASE_PATH nella parte superiore della settings.py quanto tale (Non sono sicuro se questo funzionerà per le finestre)

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

Per Windows potrebbe essere necessario utilizzare il metodo di sostituzione. (Non è sicuro .. Ma puoi provarlo come segue)

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

Lo stesso vale per il DATABASE_PATH. PS. Correggimi se sbaglio

Problemi correlati