tutorial sqlmigrate manage createsuperuser python django in-memory-database django-syncdb

sqlmigrate - python manage.py syncdb



En django, ¿cómo puedo llamar al subcomando ''syncdb'' del script de inicialización? (4)

Como sugiere " ¿Dónde colocar el código de inicio de Django? ", Puede usar middleware para su código de inicio. Los documentos de Django están 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 )

Soy nuevo en python y django, y al seguir el libro de Django aprendí sobre el comando ''python manage.py syncdb'' que me generó las tablas de la base de datos. 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 script este comando ''syncdb''? (¿Debería hacerse dentro del archivo ''settings.py''?)

ACLARACIÓN

El OP está utilizando una base de datos en memoria, que debe inicializarse 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 a través de un proceso de servidor web (como WSGI o mod_python).


Puede crear un nuevo script al que llame en lugar de manage.py que llame a manage.py:

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

Si no necesita agregar un administrador, puede cambiar la segunda línea de esta manera:

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

Supongo que lo que intenta hacer es crear su base de datos y luego iniciar su servidor con un comando cada vez.


Se puede acceder programáticamente a todos los comandos de administración de Django:

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

Lo ideal sería usar una señal pre-init en runserver para activar esto, pero tal señal no existe . Entonces, en realidad, la forma en que manejaría esto, si fuera usted, sería crear un comando de administración personalizado, como runserver_newdb , y ejecutarlo dentro de él:

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

Consulte la documentación para obtener más información sobre cómo escribir comandos de administración personalizados.


Actualizar

run.sh 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 "guión 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.