48

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

澄清

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

4

5 回答 5

85

所有 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')

有关编写自定义管理命令的更多信息,请参阅文档

于 2010-08-16T18:51:27.523 回答
11

正如“在哪里放置 Django 启动代码? ”所建议的那样,您可以将中间件用于您的启动代码。Django 文档在这里

例如(未经测试):

启动.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
 )
于 2010-08-16T19:13:29.250 回答
6

更新

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

您能否为您的问题添加更多详细信息?添加上下文并解释您到底想要完成什么?

于 2010-08-16T18:21:37.390 回答
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"])

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

于 2010-08-16T18:23:03.400 回答
0

@Daniel Naab 的答案以及官方网站中的文档不是用于执行管理命令作为入口点。

当您想在 AWS Lambda 或 Google Cloud Functions 等托管云环境中使用管理命令作为入口点时,您可以查看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...'])
于 2019-02-27T00:48:10.673 回答