如何使用Django South为现有的应用创建新数据库并设置默认值?

问题描述 投票:11回答:2

我正在使用一个使用South迁移数据库的OS项目。我正在从头开始构建新数据库,我想确保已设置South,以便将来可以轻松更新数据库。

似乎这个过程应该是:

  1. 创建数据库
  2. syncdb
  3. 迁移

但是,当我尝试迁移数据库时,较早的迁移之一(迁移0004,它们转到0009会引发异常:

ValueError: You cannot add a null=False column without a default value.

我不知道如何向迁移0004添加默认值,因此不会引发此异常。

由于数据库为空,因此不需要进行迁移。

但是,south_migrationhistory必须包含所有迁移及其应用时间的列表。

我试图破解它,只是将迁移0009手动添加到数据库,但这引发了另一个错误,因为尚未运行中间迁移。我还尝试向数据库添加一个字段,以查看是否可以确定add_column的语法看起来像默认值0。格式看起来与这些旧版迁移完全不同。

以下是add_column语法的2个不同版本:

#0004 syntax:  
db.add_column('experiments_dailyreport', 'test_group_size', orm['experiments.dailyreport:test_group_size'])
#0009 syntax:
syntax db.add_column('experiments_dailyreport', 'test_group_size', self.gf('django.db.models.fields.IntegerField')(default=0), keep_default=False)

所以,我猜想南国代码在创建0004时与今天之间有所变化。

有没有一种方法可以使用syncdb构建数据库,然后以某种方式在不运行manage.py migration的情况下更新south_migrationhistory?

如果您现有的应用具有向南迁移的功能,您将如何从头开始构建新数据库?

我无法迁移,因为在整数字段上没有默认设置。如何在旧版迁移中设置默认值?该字段甚至不再存在。

尝试使用的语法:

db.add_column('experiments_dailyreport', 'test_group_size', orm['experiments.dailyreport:test_group_size'], {'default': 0})
#throws ValueError: You cannot add a null=False column without a default value.
db.add_column('experiments_dailyreport', 'test_group_size', self.gf('django.db.models.fields.IntegerField')(default=0), keep_default=False)
#throws AttributeError: Migration instance has no attribute 'gf'

我正在使用South-0.7.2-py2.7.egg

django django-south django-database
2个回答
16
投票

[安德鲁·戈德温提供了答案:

是,使用:

./manage.py syncdb --all  

然后:

./manage.py migrate --fake  

但是,这也会忽略将数据添加到数据库中的所有迁移。


0
投票

'syncdb'不再受支持,请参阅此answer

  1. 删除所有名为“ migrations”的文件夹。
  2. 转到终端并运行:
    • ./manage.py makemigrations
    • ./manage.py migrate --run-syncdb
© www.soinside.com 2019 - 2024. All rights reserved.