2

我有一个bootstrap执行syncdb和的脚本migrate

import settings
from django.core.management import setup_environ, call_command

setup_environ(settings)                                         # Setting up the env settings
call_command('syncdb', migrate=True, interactive=False)         # Sync the database

先决条件:

  • django-south用于迁移。

过程发生:

  • initial_data夹具包含由迁移创建的模型的数据。
  • syncdb执行它会创建所有表,除了那些存在迁移的应用程序。
  • 发布syncdb它尝试加载initial_data并引发db not found错误,因为带有迁移的应用程序表不是由 syncdb 创建的。[问题]
  • 然后它执行创建数据库的迁移。
  • 发帖本次migration自动加载initial_data成功。

问题:

  • error当它试图为尚未创建的表加载夹具时,我该如何摆脱它?
  • 我可以以某种方式编辑上述脚本,使其initial_data仅在执行后加载migration
4

2 回答 2

2

您可以在 syncdb 时禁用加载初始数据:

call_command('syncdb', load_initial_data=False, interactive=False)
call_command('migrate', interactive=False)

从syncdb.py的源代码:

# Stealth option -- 'load_initial_data' is used by the testing setup                                                               
# process to disable initial fixture loading.                                                                                      
load_initial_data = options.get('load_initial_data', True)
于 2012-05-16T10:27:35.657 回答
0

有几种方法可以解决这个问题:

  1. 只需调用要为其填充数据的应用程序,即可从初始数据转储中排除应用程序
  2. 可以试试这个库https://github.com/davedash/django-fixture-magic
  3. 您可以编写自定义管理命令来填充您需要的模型
  4. 您还可以使用南方附带的数据迁移http://south.aeracode.org/docs/tutorial/part3.html

就我个人而言,我会选择 1 或 3。对于第一点,将灯具单独存储在灯具文件夹下的每个应用程序中。但是,如果您的模型发生变化,这将很难更新。因此编写自定义管理命令可能是最轻松的。

于 2012-05-16T14:09:03.690 回答