在Django中,如何从初始化脚本中调用子命令“syncdb”?
我是python和django的新手,在继Django Book之后,我学习了为我生成数据库表的命令“python manage.py syncdb”。 在开发环境中,我在内存数据库中使用sqlite,所以每次重启服务器都会自动擦除。 那么如何编写这个'syncdb'命令呢?(应该在'settings.py'文件中完成吗?)
澄清
OP正在使用一个内存数据库,这个数据库在Django模型定义的任何进程开始时都需要初始化。 确保数据库初始化的最佳方法是什么(每个进程启动一次)。 这将用于运行testing或运行服务器,通过manage.py runserver
或通过web服务器进程(如使用WSGI或mod_python)。
所有的Djangopipe理命令都可以通过程序访问 :
from django.core.management import call_command call_command('syncdb', interactive=True)
理想情况下,您可以在runserver
上使用pre-init信号来激活此信号,但是这样的信号不存在 。 所以,实际上,如果我是你,处理这个问题的方法就是创build一个自定义的pipe理命令,比如runserver_newdb
,然后在里面执行:
from django.core.management import call_command call_command('syncdb', interactive=True) call_command('runserver')
有关编写自定义pipe理命令的更多信息,请参阅文档 。
正如“ 在哪里放置Django启动代码? ”所build议的那样,您可以使用中间件来启动代码。 Django文档在这里 。
例如(未经testing):
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
。 这通常在添加新模型后完成。 如果你想用简单的shell脚本轻松完成这个任务。 我没有看到任何理由在settings.py
放置(或调用) syncdb
。
你能为你的问题添加更多细节吗? 添加上下文并解释你到底想干什么?
您可以创build一个新的脚本,而不是调用manage.py的manage.py:
from subprocess import call call(["python", "manage.py", "syncdb"]) call(["python", "manage.py", "runserver"])
如果你不需要添加一个pipe理员,你可以像这样改变第二行:
call(["python", "manage.py", "syncdb", "--noinput"])
我假设你要做的是创build你的分贝,然后用一个命令启动你的服务器每次。