3

J'ai une migration Django 1.7 qui ressemble à ceci:la migration des données Django échoue lors de l'exécution test de manage.py, mais pas lors de l'exécution manage.py migration

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals 

from django.db import models, migrations 

def units_to_m2m(apps, schema_editor): 
    Interval = apps.get_model("myapp", "Interval") 
    IntervalUnit = apps.get_model("myapp", "IntervalUnit") 

    for interval in Interval.objects.all(): 
     IntervalUnit(
      interval=interval, 
      unit=interval.unit, 
      base_date=interval.base_date 
     ).save() 

class Migration(migrations.Migration): 

    dependencies = [ 
     ('otherapp', '0007_auto_20150310_1400'), 
     ('myapp', '0009_auto_20150316_1608'), 
    ] 

    operations = [ 
     migrations.CreateModel(
      name='IntervalUnit', 
      # ... 
     ), 
     # ... 
     migrations.AddField(
      model_name='interval', 
      name='units', 
      field=models.ManyToManyField(to='otherapp.Unit', through='myapp.IntervalUnit'), 
      preserve_default=True, 
     ), 
     migrations.RunPython(units_to_m2m), 
     migrations.RemoveField(
      model_name='interval', 
      name='unit', 
     ), 
     migrations.RemoveField(
      model_name='interval', 
      name='base_date', 
     ), 
    ] 

Quand je lance manage.py migrate, il migre très bien . Quand je lance manage.py test, cependant, il tente de créer la base de données de test, échoue au milieu de cette migration avec l'erreur suivante:

Traceback (most recent call last): 
... 
    File "/home/adam/myproject/myapp/migrations/0010_auto_20150317_1516.py", line 10, in units_to_m2m 
    for interval in Interval.objects.all(): 
... 
django.db.utils.OperationalError: (1054, "Unknown column 'myapp_interval.base_date' in 'field list'") 

Lorsque je me connecte à la base de données de test après (il ne supprime pas), la structure de la base de données ressemble à ce que vous attendiez après l'exécution de la migration, même si elle s'est interrompue à mi-chemin. Que se passe t-il ici?

Edit: J'ai essayé diviser la migration en trois migrations distinctes, l'une contenant toutes les choses avant la RunPython un, un contenant RunPython lui-même, et un contenant toutes les choses qui sont par la suite; il fait toujours exactement la même chose.

+0

Les migrations devraient être ok jusqu'à ce qu'il atteigne "migrations.RunPython (units_to_m2m)". Il semble que le modèle "scheduling" n'est pas encore prêt pour cette opération dans 'myapp_interval.base_date'. J'essaierais de mettre ce modèle en dépendance et de voir quel est le résultat. – brunofitas

+0

'scheduling' et 'myapp' sont une seule et même chose, c'est juste que je n'arrive pas à anonymiser le code correctement: S –

Répondre

0

Il s'est avéré que les migrations se sont déroulées avec succès, dans l'ordre attendu, mais j'ai deux bases de données, et mes deux migrations étaient en cours sans consulter le routeur de base de données. Le ticket Django pour suivre ce problème est #23273, qui est toujours ouvert.

Vraisemblablement, la migration RunPython était interrogée par rapport à default (qui avait déjà été migré) plutôt qu'à la base de données sur laquelle la migration était censée s'exécuter.

Dans mon cas, nous n'avions plus besoin d'utiliser la deuxième base de données pour quelque chose, donc nous avons été en mesure de le supprimer de settings.DATABASES.

1

C'est un peu bizarre et nous ne savons pas pourquoi cela fonctionne, mais nous avons changé notre signature allow_migrate dans notre routeur à ce qui suit:

def allow_migrate(self, db, app_label, **hints): 
    """ 
    Make sure the mydb db does not allow migrations 
    """ 
    if db == 'mydb': 
     return False 

    return True 

Et cette erreur a mystérieusement loin. Notez que cette signature ne correspond pas à ce qui est dans la documentation 1.8 (nous utilisons 1.8.2) allow_migrate(db, app_label, model_name=None, **hints) comme indiqué ici: https://docs.djangoproject.com/en/1.8/topics/db/multi-db/#allow_migrate

Mais j'espère que cela vous aidera?

+0

Je ne comprends pas pourquoi cela fonctionne non plus, mais cela a résolu le même problème pour moi. Merci. – shacker