在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你的分贝,然后用一个命令启动你的服务器每次。