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

51 投票
5 回答
22659 浏览
提问于 2025-04-16 02:52

我刚开始学习Python和Django,在跟着Django书的内容时,了解到一个命令叫做'python manage.py syncdb',这个命令可以为我生成数据库表。在开发环境中,我使用的是内存中的sqlite数据库,所以每次重启服务器时,这个数据库里的数据都会被清空。那么,我该如何编写一个脚本来执行这个'syncdb'命令呢?(这个操作应该放在'settings.py'文件里吗?)

澄清一下

提问者使用的是内存数据库,这种数据库需要在每次启动与Django模型相关的进程时进行初始化。那有什么好的方法可以确保数据库在每次进程启动时都被初始化一次呢?这主要是为了运行测试,或者通过manage.py runserver命令启动服务器,或者通过其他的网络服务器进程(比如WSGI或mod_python)来运行。

5 个回答

7

更新

我在项目的根目录下添加了一个叫做 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

你能在问题中添加更多细节吗?提供一些背景信息,解释一下你到底想要实现什么?

11

正如在“在哪里放置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')

然后在你的settings.py中:

 MIDDLEWARE_CLASSES = (
     'your_project.middleware.startup.StartupMiddleware',

     # Existing middleware classes here
 )
89

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

想了解更多关于如何编写自定义管理命令的信息,可以查看这份文档

撰写回答