12

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

看来这个过程应该是:

  1. 创建数据库
  2. 同步数据库
  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 到今天,South 代码发生了变化。

有没有办法使用 syncdb 构建数据库,然后以某种方式更新 south_migrationhistory 而无需运行 manage.py migrate ?

如果您有一个现有的带有 South 迁移的应用程序,您将如何从头开始构建一个新数据库?

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

尝试的语法:

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

4

2 回答 2

15

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

是的,使用:

./manage.py syncdb --all  

然后:

./manage.py migrate --fake  

但是,这也会忽略将数据添加到数据库的任何迁移。

于 2010-11-12T15:06:34.780 回答
3

syncdb不再支持,相反,请参阅此答案

  1. 删除所有名为“迁移”的文件夹。
  2. 转到终端并运行:
  • ./manage.py makemigrations
  • ./manage.py migrate --run-syncdb
于 2019-11-30T21:30:10.680 回答