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

时间:2010-11-12 14:42:17

标签: django django-south django-database

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

这个过程似乎应该是:

  1. 创建数据库
  2. 执行syncdb
  3. 迁移
  4. 但是,当我尝试迁移数据库时,之前的迁移之一(迁移0004和它们转到0009)会引发异常:

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

    我不明白如何向迁移0004添加默认值,因此不会抛出此异常。

    不需要运行迁移,因为数据库为空。

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

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

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

    #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构建数据库,然后以某种方式更新south_migrationhistory而不运行manage.py migrate?

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

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

    尝试了

    语法:

    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

2 个答案:

答案 0 :(得分:16)

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

是的,使用:

./manage.py syncdb --all  

然后:

./manage.py migrate --fake  

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

答案 1 :(得分:0)

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

  1. 删除所有名为“ migrations”的文件夹。
  2. 转到终端并运行:
    • wget https://download.qemu.org/qemu-2.11.0.tar.xz tar xvJf qemu-2.11.0.tar.xz cd qemu-2.11.0 ./configure --target-list=arm-softmmu,arm-linux-user make -j 2 sudo make install
    • qemu-system-arm --version