В Django, как мне позвонить подкоманду «SyncDB» из сценария инициализации?

StackOverflow https://stackoverflow.com/questions/3495964

Вопрос

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

Разъяснение

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

Это было полезно?

Решение

Все команды управления 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 Docs здесь.

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

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

И в ваших настройках .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')

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

Я не уверен, что понимаю, что вы подразумеваете под «Scripting Command 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"])

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

Ответ @daniel Naab, а также док на официальном сайте, не предназначен для выполнения команд управления в качестве въездной точки.

Когда вы хотите использовать команду управления в качестве въезда в управляемой облачной среде, таких как AWS Lambda или функции Google Cloud, вы можете взглянуть на manage.py И попробуйте что-то подобное.

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...'])
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top