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

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

УТОЧНЕНИЕ

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

46
задан Manoj Govindan 16 August 2010 в 18:39
поделиться

4 ответа

Ко всем командам управления 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')

См. документацию ] для получения дополнительной информации о написании пользовательских команд управления.

79
ответ дан 26 November 2019 в 20:22
поделиться

Обновление

Я добавил сценарий под названием 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 .

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

5
ответ дан 26 November 2019 в 20:22
поделиться

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

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

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

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

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

0
ответ дан 26 November 2019 в 20:22
поделиться

Как советует "Где разместить стартовый код 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
 )
10
ответ дан 26 November 2019 в 20:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: