我是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...'])
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top