51 votes

Dans django, comment appeler la sous-commande 'syncdb' depuis le script d'initialisation ?

Je suis novice en matière de python et de django, et lorsque je suis les instructions de l'application Livre Django J'ai appris l'existence de la commande 'python manage.py syncdb' qui génère des tables de base de données pour moi. Dans l'environnement de développement, j'utilise une base de données sqlite in memory, donc elle est automatiquement effacée à chaque fois que je redémarre le serveur. Alors comment puis-je script cette commande 'syncdb' ? (Cela devrait-il être fait à l'intérieur du fichier 'settings.py' ?)

CLARIFICATION

Le PO utilise une base de données en mémoire, qui doit être initialisée au début de tout processus travaillant avec des modèles Django définis par rapport à cette base de données. Quelle est la meilleure façon de s'assurer que la base de données est initialisée (une fois par démarrage de processus). Il s'agit de l'exécution de tests ou de l'exécution d'un serveur, par l'intermédiaire de manage.py runserver ou via un processus de serveur web (comme avec WSGI ou mod_python).

89voto

Daniel Naab Points 9857

Toutes les commandes de gestion de Django peuvent être accédés de manière programmatique :

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

L'idéal serait d'utiliser un signal de pré-init sur runserver pour l'activer, mais un tel signal n'existe pas . Donc, en fait, la façon dont je m'occuperais de cela si j'étais vous serait de créer une commande de gestion personnalisée, comme runserver_newdb et l'exécuter à l'intérieur :

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

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

0 votes

Dans quel fichier (dans un projet django typique) placeriez-vous le "from django.core.management import call_command call_command('syncdb', interactive=True)" ?

0 votes

EdwardD'Souza : Pour ce cas d'utilisation, je le mettrais dans settings.py ou dans un script importé de settings.py

11voto

sdolan Points 15572

Comme le suggère " Où mettre le code de démarrage de Django ? ", vous pouvez utiliser un intergiciel pour votre code de démarrage. La documentation de Django est aquí .

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
 )

7voto

Manoj Govindan Points 24030

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 suis pas sûr de comprendre ce que vous entendez par "scripting de la commande syncdb". Vous exécutez généralement python manage.py syncdb à partir de la ligne de commande. Cette opération est généralement effectuée après l'ajout de nouveaux modèles. Si vous le souhaitez, vous pouvez facilement le faire en utilisant un simple script shell script. Je ne vois aucune raison de placer (ou d'invoquer) syncdb de l'intérieur settings.py .

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

0 votes

J'espère pouvoir invoquer cette commande 'syncdb' comme n'importe quelle autre méthode python, et placer l'invocation dans settings.py, de sorte que chaque fois que je démarre l'application, elle crée automatiquement la base de données.

0 votes

Je l'ai. Je ne suis pas convaincu que settings.py est le meilleur endroit pour le garder. Nous pouvons être en désaccord sur ce point :)

0 votes

Avez-vous d'autres suggestions ? Je suis complètement novice en matière de python. Comme Craig Trader l'a indiqué, l'invocation de 'syncdb' doit se faire à l'intérieur du même processus, donc je suppose que les scripts shell sont hors de question.

0voto

neuront Points 1384

La réponse de @Daniel Naab, ainsi que la doc dans le site officiel, n'est pas pour l'exécution des commandes de gestion comme point d'entrée.

Lorsque vous souhaitez utiliser une commande de gestion comme point d'entrée dans un environnement de cloud géré comme AWS Lambda ou Google Cloud Functions, vous pouvez jeter un coup d'œil à 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...'])

-1voto

jfenwick Points 748

Vous pourriez créer un nouveau script que vous appelez à la place de manage.py et qui appelle 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 modifier la deuxième ligne comme suit :

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

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

0 votes

J'espérais accéder à 'syncdb' comme une sorte d'API python, mais cela ne pose pas de problème.

0 votes

Cela ne fonctionnera probablement pas pour une base de données en mémoire, puisque chaque call invoque un processus séparé, qui aurait sa propre base de données en mémoire.

0 votes

Oui, vous avez raison. Cela laisse probablement les scripts bash hors de question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X