Frage

Ich bin neu in Python und Django, und wenn nach dem Django Buch ich habe gelernt, über den Befehl ‚python manage.py syncdb‘, die für mich generierten Datenbanktabellen. In Entwicklungsumgebung verwende ich SQLite In-Memory-Datenbank, so dass es jedes Mal automatisch gelöscht wird ich den Server neu zu starten. So wie ich Skript tut dies ‚syncdb‘ Befehl? (Should, dass in der ‚settings.py‘ Datei getan werden?)

KLARSTELLUNG

Die OP wird unter Verwendung eines In-Memory-Datenbank, die gegen diese Datenbank definiert am Anfang eines jeden Prozesses Arbeiten mit Django Modelle initialisiert werden muss. Was ist der beste Weg, um sicherzustellen, dass die Datenbank (einmal pro Prozessstart) initialisiert wird. Dies würde für die Ausführung von Tests sein, oder einen Server ausgeführt wird, entweder über manage.py runserver oder über einen Web-Server-Prozess (wie mit WSGI oder mod_python).

War es hilfreich?

Lösung

Alle Django-Management-Befehle programmatisch zugegriffen werden:

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 existieren . Also, eigentlich so, wie ich würde damit umgehen, wenn ich Sie wäre eine benutzerdefinierte Management-Befehl zu erstellen, 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')

Siehe die Dokumentation für Weitere Informationen zu benutzerdefinierten Schreiben Management-Befehle.

Andere Tipps

Wie bereits angedeutet durch " Wo Django Startup-Code setzen? ", Sie können Middleware für Ihr Startup-Code verwenden. Die Django docs sind hier .

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
 )

Aktualisieren

Ich habe ein Skript namens run.sh in das Stammverzeichnis des Projekts. 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“. Sie in der Regel python manage.py syncdb von der Kommandozeile auszuführen. Dies erfolgt in der Regel nach neuen Modellen hinzufügen. Falls Sie Sie diese mit einem einfachen Shell-Skript leicht erreichen. Ich sehe keinen Grund, an Ort (oder invoke) syncdb aus settings.py.

Könnten Sie mehr Details zu Ihrer Frage hinzufügen? In Zusammenhang und erklären, was genau Sie zu tun bekommen versuchen?

Sie können ein neues Skript erstellen, dass Sie anstelle von manage.py rufen, dass Anrufe manage.py:

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

Wenn Sie nicht brauchen, ein Admin fügen Sie die zweite Zeile wie folgt ändern könnte:

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

Ich gehe davon aus, dass, was Sie versuchen, Ihre DB zu tun erstellen und dann Ihren Server mit einem Befehl starten, jedes Mal.

@ Daniel Naab Antwort, sowie die doc in der offiziellen Website, ist nicht Management-Befehle als Einstiegspunkt für die Ausführung.

Wenn Sie einen Management-Befehl als Einstiegspunkt in Managed Cloud-Umgebung wie AWS Lambda oder Google Cloud-Funktionen nutzen möchten, können Sie einen Blick auf manage.py nehmen und versuchen, etwas Ähnliches.

import os
from django.core.management import execute_from_command_line

def publishing_fn(data, context):
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'YOURAPP.settings')
    # The first argument is "manage.py" when it's run from CLI.
    # It can be an empty string in this case
    execute_from_command_line(['', 'COMMAND', 'ARGS...'])
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top