2010-08-16 11 views
39

Sono nuovo a Python e Django e, seguendo lo Django Book, ho imparato a conoscere il comando "python manage.py syncdb" che generava tabelle di database per me. Nell'ambiente di sviluppo utilizzo sqlite nel database di memoria, quindi viene automaticamente cancellato ogni volta che riavvio il server. Allora, come faccio questo script comando 'syncdb'? (Se ciò dovesse essere fatto all'interno del file 'settings.py'?)In django, come posso chiamare il sottocomando 'syncdb' dallo script di inizializzazione?

CHIARIMENTO

Il PO utilizza un database in memoria, che ha bisogno di essere inizializzati all'inizio di qualsiasi processo che funzioni con i modelli Django definiti rispetto a quel database. Qual è il modo migliore per garantire che il database sia inizializzato (una volta avviato per ogni processo). Questo sarebbe per l'esecuzione di test, o l'esecuzione di un server, tramite manage.py runserver o tramite un processo di server web (come con WSGI o mod_python).

risposta

69

gestione Tutti Django can be accessed programmatically:

from django.core.management import call_command 
call_command('syncdb', interactive=True) 

Idealmente devi usare un segnale di pre-init su runserver per attivare questa, ma tale segnale doesn't exist. Quindi, in realtà, il modo in cui mi piacerebbe gestire questo se fossi voi sarebbe quella di creare un comando di gestione personalizzato, come runserver_newdb ed eseguire questo all'interno di esso:

from django.core.management import call_command 
call_command('syncdb', interactive=True) 
call_command('runserver') 

Vedi the documentation per ulteriori informazioni su come scrivere i comandi di gestione personalizzato .

+0

In quale file (in un tipico progetto django) posizioneresti il ​​ "da django.core.management import call_command call_command ('syncdb', interactive = True)"? –

+0

@ EdwardD'Souza: Per questo uso caso, lo metterei in 'settings.py' o in uno script importato da' settings.py' –

5

Aggiornamento

ho aggiunto uno script chiamato run.sh nella directory principale del progetto. Questo ha funzionato per me con un database SQLite:

#!/usr/bin/python 
from django.core.management import call_command 
call_command('syncdb') 
call_command('runserver') 

risposta originale

io non sono sicuro di capire cosa si intende per "script il comando syncdb". Di solito esegui python manage.py syncdb dalla riga di comando. Questo di solito viene fatto dopo l'aggiunta di nuovi modelli. Nel caso in cui lo desideri, puoi farlo facilmente utilizzando un semplice script di shell. Non vedo alcun motivo per inserire (o richiamare) syncdb dall'interno di settings.py.

Potresti aggiungere ulteriori dettagli alla tua domanda? Aggiungi il contesto e spiega che cosa stai cercando di fare esattamente?

+0

Sto sperando di richiamare questo 'syncdb'command come qualsiasi altro metodo python e posizionare l'invocazione su settings.py, così ogni volta che avvio l'app crea automaticamente il database –

+0

. Non sono convinto che 'settings.py' sia il posto migliore per tenerlo comunque. Siamo d'accordo di non essere d'accordo su questo :) –

+0

Hai qualche altro suggerimento? Sono completamente nuovo in Python. Come affermato da Craig Trader, l'invocazione per "syncdb" deve avvenire all'interno dello stesso processo, quindi penso che lasci fuori dubbio gli script di shell. –

0

Si potrebbe creare un nuovo script che si chiama, invece di manage.py che chiama manage.py:

from subprocess import call 
call(["python", "manage.py", "syncdb"]) 
call(["python", "manage.py", "runserver"]) 

Se non è necessario aggiungere un amministratore che si potrebbe modificare la seconda riga come questa:

call(["python", "manage.py", "syncdb", "--noinput"]) 

sto assumendo che ciò che si sta cercando di fare è creare il vostro db e quindi avviare il server con un comando ogni volta. comanda

+0

Speravo di accedere a 'syncdb' come una specie di API python, ma quello è ok –

+0

Probabilmente questo non funzionerà per un database in memoria, dato che ogni 'call' sta invocando un processo separato, che avrebbe il proprio database in memoria. –

+0

Sì, hai ragione. –

9

Come suggerito da "Where to put Django startup code?", è possibile utilizzare il middleware per il codice di avvio. I documenti Django sono here.

Per esempio (non testata):

startup.py:

from django.core.exceptions import MiddlewareNotUsed 
from django.conf import settings 
from django.core.management import call_command 

class StartupMiddleware(object): 
    def __init__(self): 
     # The following db settings name is django 1.2. django < 1.2 will use settings.DATABASE_NAME 
     if settings.DATABASES['default']['NAME'] == ':memory:': 
      call_command('syncdb', interactive=False) 

     raise MiddlewareNotUsed('Startup complete') 

e nel tuo settings.py:

MIDDLEWARE_CLASSES = (
    'your_project.middleware.startup.StartupMiddleware', 

    # Existing middleware classes here 
) 
+1

+1, mi piace molto questa soluzione, dal momento che succede semplicemente "automagicamente" e non richiede l'avvio di script speciali. –

+0

Soluzione davvero bella –

Problemi correlati