在django中,如何将初始化脚本中的子命令称为“ syncdb”?
-
29-09-2019 - |
题
我是Python和Django的新手,在跟随 Django书 我了解了为我生成数据库表的命令“ python manage.py syncdb”。在开发环境中,我在内存数据库中使用sqlite,因此每次重新启动服务器时都会自动删除。那么如何脚本脚本此'SynCDB'命令?(应该在'settings.py'文件中完成吗?)
澄清
OP正在使用内存数据库,该数据库需要在与该数据库定义的Django模型的任何过程开始时进行初始化。确保数据库初始化的最佳方法是什么(每次启动一次)。这将用于运行测试或运行服务器,要么通过 manage.py runserver
或通过Web服务器过程(例如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文档是 这里.
例如(未经测试):
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')
在您的设置中
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
从命令行。这通常是在添加新型号之后完成的。如果您想使用一个简单的Shell脚本来轻松完成此操作。我没有任何理由放置(或调用) syncdb
从内部 settings.py
.
您可以在您的问题中添加更多详细信息吗?添加上下文并说明您到底要完成什么?
您可以创建一个新脚本,而不是chand.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的答案以及官方站点中的DOC并不是将管理命令作为入口处执行。
当您想将管理命令用作托管云环境(例如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...'])