在django中,如何从初始化脚本中调用子命令“syncdb”?

时间:2010-08-16 18:10:54

标签: python django in-memory-database django-syncdb

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

澄清

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

5 个答案:

答案 0 :(得分:78)

所有Django管理命令can be accessed programmatically

from django.core.management import call_command
call_command('syncdb', interactive=True)

理想情况下,您会在runserver上使用pre-init信号激活此信号,但这样的信号doesn't exist。所以,实际上,如果我是你,我将处理这个问题的方法是创建一个自定义管理命令,如runserver_newdb,并在其中执行:

from django.core.management import call_command
call_command('syncdb', interactive=True)
call_command('runserver')

有关编写自定义管理命令的详细信息,请参阅the documentation

答案 1 :(得分:9)

根据“Where to put Django startup code?”的建议,您可以将中间件用于启动代码。 Django文档是here

例如(未经测试):

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
 )

答案 2 :(得分:5)

<强>更新

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

您可以在问题中添加更多详细信息吗?添加上下文并解释您到底想要完成的内容?

答案 3 :(得分:0)

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

的manage.py.
from subprocess import call
call(["python", "manage.py", "syncdb"])
call(["python", "manage.py", "runserver"])

如果您不需要添加管理员,可以像这样更改第二行:

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

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

答案 4 :(得分:0)

@Daniel Naab的回答以及官方站点中的文档,都不是作为入口点执行管理命令的。

当您想使用管理命令作为AWS Lambda或Google Cloud Functions之类的托管云环境中的入口点时,可以查看var array1 = ['bob', 'bob', 'billy', 'paul']; var array2 = ['bob', 'bob', 'bob', 'billy']; var contains = false; var output = true; array2.forEach(e2 => { contains = false; array1.forEach(e1 => { if (e2 == e1) { contains = true; array1.splice(array1.indexOf(e1), 1); } }) if (!contains) { output = false; } }); console.log(output);并尝试类似的操作。

manage.py