2010-08-16 19 views
39

Ich bin neu bei Python und Django, und wenn ich die Django Book folgte, erfuhr ich über den Befehl 'Python manage.py Syncdb', die Datenbanktabellen für mich generiert. In der Entwicklungsumgebung verwende ich sqlite in der Speicherdatenbank, so dass es automatisch gelöscht wird, wenn ich den Server neu starte. So wie ich dieses Skript ‚syncdb‘ Befehl? (Das in der ‚settings.py‘ Datei getan werden sollte?)In Django, wie rufe ich den Unterbefehl 'Syncdb' aus dem Initialisierungsskript?

KLARSTELLUNG

Die OP ist eine In-Memory-Datenbank, die muss zu Beginn eines Prozesses initialisiert werden, der mit Django-Modellen arbeitet, die für diese Datenbank definiert sind. Was ist der beste Weg, um sicherzustellen, dass die Datenbank initialisiert wird (einmal pro Prozessstart). Dies wäre zum Ausführen von Tests oder zum Ausführen eines Servers, entweder über manage.py runserver oder über einen Webserver-Prozess (z. B. mit WSGI oder mod_python).

Antwort

69

Alle Django-Management-Befehle can be accessed programmatically:

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

Im Idealfall würden Sie ein Pre-Init-Signal auf runserver verwenden, um dies zu aktivieren, aber ein solches Signal doesn't exist. Also, eigentlich so, wie ich würde damit umgehen, wenn ich Sie ein eigenes Management-Befehl zu erstellen wäre, wie runserver_newdb, und führen Sie diese im Inneren:

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

the documentation Weitere Informationen finden Sie auf Schreiben von benutzerdefinierten Verwaltungsbefehle .

+0

In welcher Datei (in einem typischen Django-Projekt) würden Sie die "von django.core.management import call_command call_command ('syncdb', interaktiv = True)"? –

+0

@ EdwardD'Souza: Für diesen Zweck Fall würde ich es in 'settings.py' oder in einem Skript setzen, das von' settings.py' –

5

aktualisieren

Ich habe ein Skript run.sh im Projektstammverzeichnis genannt. Dieser arbeitete für mich mit einer SQLite-Datenbank:

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

Original-Antwort

Ich bin nicht sicher, ob ich verstehe, was du meinst mit „Skripts für den syncdb Befehl“. Normalerweise führen Sie python manage.py syncdb über die Befehlszeile aus. Dies geschieht normalerweise nach dem Hinzufügen neuer Modelle. Falls Sie das einfach mit einem einfachen Shell-Skript erreichen wollen. Ich sehe keinen Grund, syncdb aus zu platzieren (oder aufzurufen).

Können Sie Ihrer Frage weitere Details hinzufügen? Fügen Sie einen Kontext hinzu und erklären Sie, was Sie genau machen wollen.

+0

Ich hoffe, diese ‚syncdb'command aufzurufen als jede andere Python-Methode, und platzieren Sie den Aufruf an settings.py, so dass jedes Mal, wenn ich die App starte, erstellt er automatisch die Datenbank –

+0

. Ich bin nicht davon überzeugt, dass 'settings.py' der beste Ort ist, um es zu behalten. Wir können zustimmen, darüber nicht zu stimmen :) –

+0

Haben Sie einen anderen Vorschlag? Ich bin völlig neu in Python. Wie Craig Trader sagte, muss der Aufruf für 'syncdb' innerhalb desselben Prozesses geschehen, also denke ich, dass Shell-Skripte nicht in Frage kommen. –

0

Sie könnten ein neues Skript erstellen, die Sie anstelle von manage.py aufrufen, die manage.py ruft:

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

Wenn Sie ein Admin nicht hinzufügen müssen Sie die zweite Zeile wie folgt ändern könnte:

Ich gehe davon aus, dass das, was Sie versuchen, ist, erstellen Sie Ihre Datenbank und starten Sie den Server dann mit einem Befehl jedes Mal.

+0

Ich hatte gehofft, 'syncdb' als eine Art Python-API zu nutzen, aber das ist ok –

+0

Dies funktioniert wahrscheinlich nicht für eine In-Memory-Datenbank, da jeder 'Aufruf' einen separaten Prozess aufruft, der eine eigene In-Memory-Datenbank hätte –

+0

Ja, das stimmt, das lässt wahrscheinlich bash-Skripte aus –

9

Wie von "Where to put Django startup code?" vorgeschlagen, können Sie Middleware für Ihren Startup-Code verwenden. Die Django-Dokumente sind .

Zum Beispiel (ungetestet):

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

und in Ihrem settings.py:

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

    # Existing middleware classes here 
) 
+1

+1 importiert wird, mag ich diese Lösung wirklich, da Es passiert einfach "automatisch" und erfordert keine speziellen Skripte zum Starten. –

+0

Wirklich schöne Lösung –