2010-08-16 8 views
39

Soy nuevo en python y django, y al seguir el Django Book aprendí sobre el comando 'python manage.py syncdb' que generó tablas de base de datos para mí. En el entorno de desarrollo utilizo sqlite en la base de datos de memoria, por lo que se borra automáticamente cada vez que reinicio el servidor. Entonces, ¿cómo hacer que la escritura de este comando '' syncdb? (En caso de que se haga dentro del archivo 'settings.py'?)En django, ¿cómo llamo al subcomando 'syncdb' desde el script de inicialización?

CLARIFICACION

El PO es el uso de una base de datos en memoria, que debe ser inicializado al inicio de cualquier proceso que trabaje con los modelos de Django definidos en esa base de datos. Cuál es la mejor manera de garantizar que la base de datos se inicialice (una vez por cada inicio del proceso). Esto sería para ejecutar pruebas o ejecutar un servidor, ya sea a través de manage.py runserver o mediante un proceso de servidor web (como WSGI o mod_python).

Respuesta

69

gestión Todo Django can be accessed programmatically:

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

Lo ideal sería que tendría que utilizar una señal de pre-init en runserver para activar esto, pero tal señal doesn't exist. Así que, en realidad, la forma en que manejaría esto si yo fuera usted sería la creación de un comando de administración personalizado, como runserver_newdb, y ejecutar esta dentro de él:

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

Ver the documentation para obtener más información sobre cómo escribir comandos de gestión personalizada .

+0

En qué archivo (en un proyecto django típico) colocaría el "desde django.core.management import call_command call_command ('syncdb', interactive = True)"? –

+0

@ EdwardD'Souza: Para este uso caso, lo pondría en 'settings.py' o en un script importado de' settings.py' –

5

actualización

que añade un script llamado run.sh en el directorio raíz del proyecto. Esto funcionó para mí con una base de datos SQLite:

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

respuesta original

No estoy seguro de entender lo que quiere decir con "el procesamiento del comando syncdb". Por lo general, ejecuta python manage.py syncdb desde la línea de comandos. Esto generalmente se hace después de agregar nuevos modelos. En caso de que lo desee, puede lograrlo fácilmente utilizando un simple script de shell. No veo ningún motivo para colocar (o invocar) syncdb desde settings.py.

¿Podría agregar más detalles a su pregunta? Agrega contexto y explica qué estás tratando de hacer exactamente.

+0

Estoy esperando para invocar este 'syncdb'command como cualquier otro método de python, y coloque la invocación en settings.py, así que cada vez que inicie la aplicación crea automáticamente la base de datos –

+0

. No estoy convencido de que 'settings.py' sea el mejor lugar para guardarlo. Podemos estar de acuerdo en no estar de acuerdo :) –

+0

¿Tiene alguna otra sugerencia? Soy completamente nuevo en Python. Como dijo Craig Trader, la invocación de 'syncdb' debe ocurrir dentro del mismo proceso, por lo que supongo que deja scripts de shell fuera de toda duda. –

0

Se puede crear un nuevo guión que se llama en lugar de manage.py que llama manage.py:

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

Si no necesita agregar un administrador que podría cambiar la segunda línea como la siguiente:

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

estoy asumiendo que lo que estamos tratando de hacer es crear su base de datos y luego iniciar el servidor con un comando cada vez. Comandos

+0

Tenía la esperanza de acceder a 'syncdb' como una especie de API de Python, pero eso es –

+0

Esto probablemente no funcionará para una base de datos en memoria, ya que cada 'llamada' está invocando un proceso separado, que tendría su propia base de datos en memoria. –

+0

Sí, tienes razón. Eso probablemente deja scripts bash fuera de pregunta. –

9

Según lo sugerido por "Where to put Django startup code?", puede usar middleware para su código de inicio. Los documentos de Django son here.

Por ejemplo (no probado):

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

y en su settings.py:

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

    # Existing middleware classes here 
) 
+1

+1, realmente me gusta esta solución, ya que simplemente sucede "automágicamente" y no requiere scripts especiales para comenzar. –

+0

Solución realmente agradable –

Cuestiones relacionadas