En Django, Como llamar en el subcomando 'syncdb' desde el script de inicialización?
-
29-09-2019 - |
Pregunta
Soy nuevo en Python y Django, y cuando se sigue el Django libro aprendí sobre el comando 'python manage.py syncdb' que genera tablas de bases de datos para mí. En el entorno de desarrollo utilizo SQLite base de datos en memoria, por lo que se borra automáticamente cada vez que reinicie el servidor. Entonces, ¿cómo hacer que la escritura de este comando 'syncdb'? (En caso de que se haga dentro del archivo 'settings.py'?)
Aclaración
El PO está utilizando una base de datos en memoria, que debe ser inicializado al comienzo de cualquier proceso de trabajo con los modelos de Django definidos en contra de esa base de datos. ¿Cuál es la mejor manera de asegurar que la base de datos se inicializa (una vez al inicio del proceso). Esto sería para la ejecución de pruebas, o ejecutar un servidor, ya sea a través de manage.py runserver
o a través de un proceso de servidor web (tal como con WSGI o mod_python).
Solución
Todos los comandos de administración de Django se puede acceder mediante programación :
from django.core.management import call_command
call_command('syncdb', interactive=True)
Lo ideal sería utilizar una señal de pre-INIT en runserver
para activar esto, pero tal señal doesn' t existen . 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')
la documentación para obtener más información sobre cómo escribir personalizada comandos de gestión.
Otros consejos
Como sugiere " Dónde poner el código Django inicio? ", puede utilizar el middleware para su código de inicio. La documentación de Django son aquí .
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
)
Actualizar
He añadido 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, ejecutar python manage.py syncdb
desde la línea de comandos. Esto se hace generalmente después de añadir nuevos modelos. En caso de que quiera a realizar con facilidad esta utilizando un simple script de shell. No veo ninguna razón para el lugar (o invocar) syncdb
desde dentro settings.py
.
¿Es posible añadir más detalles a su pregunta? Añadir contexto y explicar qué es exactamente estás tratando de conseguir hecho?
Se puede crear un nuevo guión que se llama en lugar de que las llamadas manage.py manage.py:
from subprocess import call
call(["python", "manage.py", "syncdb"])
call(["python", "manage.py", "runserver"])
Si usted no necesita agregar un administrador puede 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.
La respuesta de @ Daniel Naab, así como el documento en el sitio oficial, no es para ejecutar comandos de administración como un punto de entrada.
Cuando se desea utilizar un comando de gestión como el punto de entrada en el entorno de la nube gestionada como AWS Lambda o Funciones de Google Cloud, puede echar un vistazo a manage.py
y probar algo similar.
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...'])