0

我正在使用 Django==1.7,并且有四个应用程序:

frontend
game
geo
people

应用程序设置是这样的:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'fandjango',
    'people',
    'geo',
    'game',
    'frontend'
)

数据库设置是:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'hoods_raising',
        'USER': 'hoods_raising',
        'PASSWORD': 'hr$nestor$123',
        'HOST': 'localhost',
        'TEST_CHARSET': 'utf8mb4'
    }
}

我的应用程序有迁移和测试:

game
    migrations
        0001_initial.py
geo
    migrations
        0001_initial.py
    tests.py
people
    migrations
        0001_initial.py
        0002_install_data.py

许多文件被省略以缩小问题范围(如果需要,我将使用更多文件扩展问题),models.py例如views.py.

的内容0002_install_data.py是:

class Migration(migrations.Migration):

    dependencies = [
        ('people', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(NamesInstaller(), lambda apps, schema_editor: None)
    ]

如果我运行manage.py migrate安装数据库,一切都会按预期工作。

如果我运行manage.py test测试,第一步将是测试数据库安装。奇怪的事情发生了:

  • 要执行的第一个迁移是 0002_install_data。永远不会创建其他表(例如 auth 表、geo 表、游戏表、fandjango 表……),并且people不会运行迁移 0001_initial in。
  • 由于这样的原因,出现依赖错误0002_install_data(它说不0001_initial存在)。

    KeyError: u"Migration people.0002_install_data dependencies references nonexistent parent node (u'people', u'0001_initial')"
    

为什么会发生这种情况?为什么该test命令不能正确安排应用程序迁移?(这不会发生在manage.py migrate)。

4

1 回答 1

3

我解决了。出现这个问题是因为我弄乱了 Squashed 迁移:因为我没有事先将它部署到生产环境中,所以我自由地删除了替换的迁移(并且只保留了 squashed)。

当您删除替换的迁移并保持压缩然后迁移时,一切都会按预期工作。replaced但是,如果您运行squashed 迁移将引用迁移tests,因此它将失败。

不幸的是,我将压缩的迁移命名为 0001_initial,就像第一次迁移一样,这让我误以为这是现有文件的依赖问题。

所以:如果您想压缩迁移,请确保您知道自己在做什么,并且不要删除以前的迁移,除非:

  • 您知道没有人会再次使用它们(即没有实例位于压缩迁移路径的“中间”)。
  • 您在压缩的迁移中删除了替换指令。否则测试将失败,因为数据库将无法设置。
于 2014-09-24T01:55:38.983 回答