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

看来这个过程应该是:

  • 创建数据库
  • syncdb
  • 迁移

  • 但是,当我尝试迁移数据库时,较早的迁移之一(迁移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

    最佳答案

    安德鲁·戈德温(Andrew Godwin)提供了一个答案:

    是的,使用:

    ./manage.py syncdb --all
    

    然后:
    ./manage.py migrate --fake
    

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

    关于django - 如何使用Django South为现有App创建新数据库并设置默认值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4165737/

    10-09 07:25
    查看更多