2014-09-24 4 views
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, таблицы географии, таблицы игр, таблицы fandjango, ...) и миграция 0001_initial в people не запускается.
  • Для такой причины, ошибка зависимости возникает в 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).

ответ

3

Я решил. Эта проблема возникла из-за того, что я перепутал с Squashed-переходами: поскольку я не использовал это заранее для продуктивной среды, я взял на себя свободу удалить замененные миграции (и только сохранить сжатые).

Когда вы удаляете замененные миграции и держите сжатые, а затем выполняете миграцию, все будет работать так, как ожидалось. Однако сжатая миграция будет ссылаться на миграцию replaced, если вы запустите tests, и поэтому она не удастся.

К сожалению, я назвал смятую миграцию 0001_initial, как и первую миграцию, которая вводит меня в заблуждение, чтобы думать, что это проблема зависимости с существующим файлом.

Итак: Если вы хотите, чтобы раздавить миграцию убедитесь, что вы знаете, что вы делаете и не удалять предыдущие миграции, если:

  • Вы не знаете, что никто не будет использовать их снова (т.е. экземпляр не является «посередине» пересеченной миграции).
  • УДАЛИТЬ директиву замены в сжатой миграции. В противном случае тесты не удастся, потому что база данных не сможет установить.
+0

из [документы] (https://docs.djangoproject.com/en/1.8/topics/migrations/): '' 'После того, как вы раздавлены миграцию, то вы должны совершить его вместе с миграциями он заменяет и распространяет это изменение на все запущенные экземпляры вашего приложения, следя за тем, чтобы они выполняли миграцию для сохранения изменений в своей базе данных. После того, как это было сделано, вы должны перевести сжатую миграцию в обычную начальную миграцию, используя ... '' ' – Hussam

Смежные вопросы