我是python和django的新手,在关注Django Book后,我了解了为我生成数据库表的命令'python manage.py syncdb'。在开发环境中,我在内存数据库中使用sqlite,因此每次重新启动服务器时都会自动删除它。那么如何编写这个'syncdb'命令的脚本?(应该在'settings.py'文件中完成吗?)
澄清
OP正在使用内存数据库,需要在使用针对该数据库定义的Django模型的任何进程开始时对其进行初始化。确保数据库初始化的最佳方法是什么(每个进程启动一次)。这可以通过manage.py runserver
或通过Web服务器进程(例如使用WSGI或mod_python)运行测试或运行服务器。
答案 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