Python 在django中,如何调用子命令';syncdb';从初始化脚本?

Python 在django中,如何调用子命令';syncdb';从初始化脚本?,python,django,in-memory-database,django-syncdb,Python,Django,In Memory Database,Django Syncdb,我是python和django的新手,在学习之后,我了解了为我生成数据库表的命令“python manage.py syncdb”。在开发环境中,我使用sqlite内存数据库,所以每次重新启动服务器时,它都会被自动删除。那么如何编写这个“syncdb”命令的脚本?(应该在“settings.py”文件中完成吗?) 澄清 OP使用的是内存中的数据库,需要在使用针对该数据库定义的Django模型的任何进程开始时初始化该数据库。确保数据库初始化(每个进程启动一次)的最佳方法是什么。这将用于通过mana

我是python和django的新手,在学习之后,我了解了为我生成数据库表的命令“python manage.py syncdb”。在开发环境中,我使用sqlite内存数据库,所以每次重新启动服务器时,它都会被自动删除。那么如何编写这个“syncdb”命令的脚本?(应该在“settings.py”文件中完成吗?)

澄清


OP使用的是内存中的数据库,需要在使用针对该数据库定义的Django模型的任何进程开始时初始化该数据库。确保数据库初始化(每个进程启动一次)的最佳方法是什么。这将用于通过
manage.py runserver
或Web服务器进程(例如使用WSGI或mod_python)运行测试或运行服务器。

更新

我在项目的根目录中添加了一个名为
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


你能为你的问题补充更多细节吗?添加上下文并解释你到底想做什么

您可以创建一个调用的新脚本,而不是调用manage.py的manage.py:

from subprocess import call
call(["python", "manage.py", "syncdb"])
call(["python", "manage.py", "runserver"])
如果您不需要添加管理员,可以更改第二行,如下所示:

call(["python", "manage.py", "syncdb", "--noinput"])

我假设您要做的是创建数据库,然后每次用一个命令启动服务器。

所有Django管理命令:

理想情况下,您应该在
runserver
上使用一个pre-init信号来激活它,但是这样一个信号。因此,实际上,如果我是你,我处理这个问题的方法是创建一个自定义管理命令,如
runserver\u newdb
,并在其中执行:

from django.core.management import call_command
call_command('syncdb', interactive=True)
call_command('runserver')
有关编写自定义管理命令的更多信息,请参阅。

如“”所建议,您可以将中间件用于启动代码。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')

@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...'])

我希望将“syncdb”作为某种python API进行访问,但这没关系。这可能对内存中的数据库不起作用,因为每个
调用都调用一个单独的进程,该进程将有自己的内存中数据库。是的,你是对的。这可能使bash脚本不成问题。我希望像其他python方法一样调用这个“syncdb”命令,并将调用放在settings.py,这样每次启动应用程序时,它都会自动创建数据库,明白了吗。但是我不相信
settings.py
是保存它的最好地方。我们可以同意在这个问题上有不同意见:)你还有其他建议吗?我对python一无所知。正如Craig Trader所说,“syncdb”的调用必须发生在同一个进程中,因此我想这就不需要考虑shell脚本了。找到了一种通过API调用
syncdb
的机制。更新答案。关于放在哪里还没有更好的主意:(因为Daniel回答了第一个学分归他所有,但还是要感谢+1的帮助。在一个典型的django项目中,您将“from django.core.management import call_command call_command('syncdb',interactive=True)”放在哪个文件中?@EdwardD'Souza:对于这个用例,我将把它放在
settings.py
或从
settings.py
导入的脚本中
 MIDDLEWARE_CLASSES = (
     'your_project.middleware.startup.StartupMiddleware',

     # Existing middleware classes here
 )
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...'])