В django, как мне вызвать подкоманду syncdb из сценария инициализации?

Я новичок в python и django, и, следуя книге Django, я узнал о команде «python manage.py syncdb», которая создала для меня таблицы базы данных. В среде разработки я использую sqlite в базе данных памяти, поэтому он автоматически стирается каждый раз, когда я перезапускаю сервер. Итак, как мне выполнить скрипт этой команды «syncdb» (если это делается внутри файла settings.py?)

ПОЯСНЕНИЯ

OP использует базу данных в памяти, которая должна быть инициализирована в начале любого процесса, работающего с моделями Django, определенными для этой базы данных. Каков наилучший способ гарантировать инициализацию базы данных (один раз за начало процесса). Это было бы для запуска тестов или запуска сервера либо с помощью manage.py runserver либо через процесс веб-сервера (например, с WSGI или mod_python).

4 Solutions collect form web for “В django, как мне вызвать подкоманду syncdb из сценария инициализации?”

Доступ ко всем командам управления Django можно получить программно :

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

В идеале вы должны использовать сигнал предварительной инициализации на runserver чтобы активировать это, но такого сигнала не существует . Итак, на самом деле, как бы я справился с этим, если бы я был вами, вы должны были создать настраиваемую команду управления, такую ​​как runserver_newdb , и выполнить ее внутри:

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

Дополнительную информацию о написании пользовательских команд управления см. В документации .

Как было предложено « Где поставить код запуска Django? », Вы можете использовать промежуточное программное обеспечение для вашего кода запуска. Документы Django находятся здесь .

Например (непроверенный):

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

и в вашем settings.py:

  MIDDLEWARE_CLASSES = ( 'your_project.middleware.startup.StartupMiddleware', # Existing middleware classes here ) 

Обновить

Я добавил скрипт под названием run.sh в корневой каталог проекта. Это работало для меня с базой данных SQLite:

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

Оригинальный ответ

Я не уверен, что понимаю, что вы подразумеваете под «написанием команды syncdb». Обычно вы запускаете python manage.py syncdb из командной строки. Обычно это делается после добавления новых моделей. Если вы хотите, чтобы вы легко выполнили это, используя простой скрипт оболочки. Я не вижу причин поместить (или вызвать) syncdb из settings.py .

Не могли бы вы добавить дополнительные сведения к своему вопросу? Добавьте контекст и объясните, что именно вы пытаетесь сделать?

Вы можете создать новый скрипт, который вы вызываете вместо manage.py, который вызывает manage.py:

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

Если вам не нужно добавлять администратора, вы можете изменить вторую строку следующим образом:

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

Я предполагаю, что то, что вы пытаетесь сделать, это создать свой db, а затем запускать сервер с помощью одной команды каждый раз.

Python - лучший язык программирования в мире.