En django, comment dois-je appeler la sous-commande « syncdb » à partir du script d'initialisation?

StackOverflow https://stackoverflow.com/questions/3495964

Question

Je suis nouveau à python et django, et en suivant les Django Livre J'ai appris sur la commande « python manage.py syncdb » les tables de base de données généré pour moi. Dans l'environnement de développement J'utilise sqlite dans la base de données de la mémoire, il est automatiquement effacé à chaque fois que je redémarre le serveur. Alors, comment puis-je le script de cette commande « syncdb »? (Si cela devait se faire à l'intérieur du fichier « settings.py »?)

CLARIFICATION

OP utilise une base de données en mémoire, qui doit être initialisé au début de tout travail de processus avec des modèles Django définies contre cette base de données. Quelle est la meilleure façon de faire en sorte que la base de données est initialisé (une fois par démarrage du processus). Ce serait pour l'exécution des tests, ou l'exécution d'un serveur, soit par l'intermédiaire d'manage.py runserver ou par l'intermédiaire d'un processus de serveur web (par exemple avec WSGI ou mod_python).

Était-ce utile?

La solution

Toutes les commandes de gestion de Django est accessible par programme :

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

Idéalement vous devriez utiliser un signal de pré-init sur runserver pour cela, mais un tel signal n » t existe. Donc, en fait, la façon dont je voudrais traiter ce si je vous serait de créer une commande de gestion personnalisée, comme runserver_newdb, et exécuter ce à l'intérieur:

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

Voir la documentation pour plus d'informations sur l'écriture personnalisée commandes de gestion.

Autres conseils

Comme le suggère " Où placer le code de Django? ", vous pouvez utiliser middleware pour votre code de démarrage. Les docs de Django sont .

Par exemple (non testé):

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

et dans votre settings.py:

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

     # Existing middleware classes here
 )

Mise à jour

J'ai ajouté un script appelé run.sh dans le répertoire racine du projet. Cela a fonctionné pour moi avec une base de données SQLite:

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

Réponse originale

Je ne sais pas, je comprends ce que vous entendez par « script la commande syncdb ». Vous exécutez habituellement python manage.py syncdb de la ligne de commande. Cela se fait habituellement après l'ajout de nouveaux modèles. Si vous voulez vous accomplissez facilement cela en utilisant un script shell simple. Je ne vois aucune raison de placer (ou Invoke) syncdb à l'intérieur settings.py.

Pouvez-vous ajouter plus de détails à votre question? Ajouter contexte et expliquer ce que vous essayez exactement à se faire?

Vous pouvez créer un nouveau script que vous appelez au lieu de manage.py que les appels manage.py:

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

Si vous n'avez pas besoin d'ajouter un administrateur, vous pouvez changer la deuxième ligne comme ceci:

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

Je suppose que ce que vous essayez de faire est de créer votre base de données, puis démarrez votre serveur avec une commande à chaque fois.

La réponse de Naab @ Daniel, ainsi que le document sur le site officiel, n'est pas pour exécuter des commandes de gestion en tant que point d'entrée.

Si vous voulez utiliser une commande de gestion comme le point d'entrée dans un environnement de nuage géré comme AWS Lambda ou Google Fonctions Cloud, vous pouvez jeter un oeil à manage.py et essayer quelque chose de similaire.

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...'])
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top