В 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, а затем запускать сервер с помощью одной команды каждый раз.

 
Interesting Posts for Van-Lav

удаленное выполнение сценария оболочки с помощью python

Лучший способ для zip-файлов в Python (zip целый каталог с одной командой)?

Как использовать Django для получения имени для хост-сервера?

Как установить скрипты python cli с помощью setuptools без дубликатов?

Получение «Ошибка загрузки модуля MySQLdb: нет модуля с именем MySQLdb» в django-cms

Измените текущую среду процесса LD_LIBRARY_PATH

Каков наилучший способ сопоставления дисков Windows с помощью Python?

pygraphviz ValueError: точка программы не найдена в пути (python)

Почему качество изображений JPEG, созданных PIL, настолько плохое?

Импорт модулей Python из разных рабочих каталогов

falied установить колбу под virutalenv на окна – Система не может найти указанный файл

Доступ к экземпляру работника сельдерея в задаче

Как внедряется string.find в CPython?

Python найдет первый сетевой хоп

Форматирование строки даты в Python для дат до 1900 года?

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