2010-11-12 21 views
11

Je travaille avec un projet OS qui utilise South pour migrer la base de données. Je construis une nouvelle base de données à partir de zéro et je veux m'assurer que South est configuré pour que je puisse facilement mettre à jour la base de données dans le futur.Comment créer une nouvelle base de données pour une application existante en utilisant Django South et définir des valeurs par défaut?

Il semble que ce processus devrait être:

  1. créer le db
  2. syncdb
  3. émigrent

Cependant, lorsque je tente de migrer les bases de données, l'une des migrations antérieures (migration 0004 et ils vont à 0009) jette une exception:

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

Je ne comprends pas comment ajouter une valeur par défaut à la migration 0004 afin que cette exception ne soit pas levée.

Les migrations n'ont pas besoin d'être exécutées car la base de données est vide.

Cependant, south_migrationhistory doit contenir une liste de toutes les migrations et quand elles ont été appliquées.

J'ai essayé de le hacker et d'ajouter manuellement la migration 0009 à la base de données, mais cela a jeté une autre erreur car les migrations intermédiaires n'avaient pas été exécutées. J'ai également essayé d'ajouter un champ à la base de données pour voir si je pouvais comprendre la syntaxe de add_column ressemblerait à une valeur par défaut de 0 fourni. Le format semble totalement différent de ces anciennes migrations.

Voici les 2 versions différentes de la syntaxe 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) 

Alors, je suppose qu'il y avait un changement dans le code du Sud entre le moment où 0004 a été créé et aujourd'hui.

Existe-t-il un moyen de construire la base de données avec syncdb et puis mettre à jour en quelque sorte south_migrationhistory sans exécuter manage.py migrate?

Si vous avez une application existante avec des migrations vers le sud, comment créeriez-vous une nouvelle base de données à partir de zéro?

Je ne peux pas effectuer de migration car aucun jeu de paramètres par défaut n'est défini sur un champ entier. Comment définir une valeur par défaut dans une ancienne migration? Le champ n'existe même plus.

syntaxes essayé:

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' 

J'utilise du Sud-0.7.2-py2.7.oeuf

Répondre

16

Andrew Godwin a fourni une réponse:

Oui, utilisez:

./manage.py syncdb --all 

alors:

./manage.py migrate --fake 

Cette volonté, cependant, ignorer également les migrations qui ajoutent des données à la base de données.