2010-08-16 2 views
39

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

РАЗЪЯСНЕНИЕ

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

ответ

69

управления Все команды Джанго can be accessed programmatically:

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

В идеале вы бы использовать сигнал предварительной инициализации на runserver для активации, но такой сигнал doesn't exist. Таким образом, на самом деле, как я бы справиться с этим, если бы я вам было бы создать команду пользовательского управления, как runserver_newdb, и выполнить это внутри него:

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

См the documentation для получения дополнительной информации о написании команд пользовательского управления ,

+0

В каком файле (в типичном проекте django) вы разместили бы "из django.core.management import call_command call_command ('syncdb', interactive = True)?? –

+0

@ EdwardD'Souza: для этого использования case, я бы поместил его в 'settings.py' или в скрипт, импортированный из' settings.py' –

5

Update

Я добавил скрипт 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.

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

+0

Я в надежде вызвать этот «syncdb'command, как любой другой метод python, и поместите вызов на settings.py, поэтому каждый раз, когда я запускаю приложение, он автоматически создает базу данных. –

+0

Получил это. Я не уверен, что 'settings.py' - лучшее место для его сохранения. Мы можем согласиться не согласиться с этим :) –

+0

Есть ли у вас какие-либо другие предложения? Я совершенно не знаком с python. Как заявил Крейг Трейдер, вызов для «syncdb» должен происходить внутри одного и того же процесса, поэтому я предполагаю, что из-за проблем с сценариями оболочки не возникает. –

0

Вы можете создать новый сценарий, который вы называете вместо 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

Я надеялся получить доступ к «syncdb» как к некоторому API-интерфейсу python, но это –

+0

Возможно, это не сработает для базы данных в памяти, так как каждый 'call' вызывает отдельный процесс, который будет иметь свою собственную базу данных в памяти. –

+0

Да, вы правы. Вероятно, это выходит из сценариев bash –

9

Как предложено «Where to put Django startup code?», вы можете использовать промежуточное программное обеспечение для вашего кода запуска. Документы Django: here.

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

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 
) 
+1

+1, мне действительно нравится это решение, поскольку это просто происходит «автоматически» и не требует специальных скриптов. –

+0

Действительно приятное решение –

 Смежные вопросы

  • Нет связанных вопросов^_^