Django Sud - table existe déjà
Je suis en train de commencer avec le Sud. J'avais une base de données existante et j'ai ajouté du Sud (syncdb
, schemamigration --initial
).
Ensuite, j'ai mis à jour models.py
pour ajouter un champ et a couru ./manage.py schemamigration myapp --auto
. Il semblait trouver le terrain et dit que je pouvais appliquer ce avec ./manage.py migrate myapp
. Mais, ce qu'a donné le message d'erreur:
django.db.utils.DatabaseError: table "myapp_tablename" already exists
tablename
est le premier tableau figurant dans models.py
.
Je suis en cours d'exécution Django 1.2, Sud de 0,7
Vous devez vous connecter pour publier un commentaire.
puisque vous avez déjà les tables dans la base de données, il vous suffit de lancer la migration initiale de faux
assurez-vous que le schéma de modèles est le même que le schéma de tables dans la base de données.
schemamigration
avant lamigrate
dans le cas où nous avons déjà fait des modifications avant la dernièreschemamigration
../manage.py schemamigration myapp --inital
et utiliser les./manage.py convert_to_south myapp
à la place. Les docs aussi dire que si la propagation des modifications via VCS ensuite utiliser--fake
sur les autres clones après l'utilisation deconvert_to_south
et en poussant/tirant des changements.Eu exactement le même problème!!!!
1.Tout d'abord vérifier le numéro de migration qui en est la cause. Supposons qu'il est: 0010.
2.Vous avez besoin de:
si il n'y a plus d'un champ manquant, vous devez la répéter pour chaque champ.
3.Maintenant, vous débarquez avec un tas de nouvelles migrations pour supprimer leurs fichiers de myapp/migrations (0011 et plus loin si vous avez besoin d'ajouter plusieurs champs).
4.Exécuter cette:
Essayez maintenant ./manage.py migrer myapp
Si il ne s'agit pas que vous êtes prêt. Juste de façon optimale si un champ ne sont pas manquantes.
EDIT:
Ce problème peut également se produire lorsque vous avez une base de données de production pour lequel vous installez le Sud et le premier, migration initiale créés dans d'autres nécessitant des doublons que vous avez déjà dans votre base de données. La solution est beaucoup plus facile ici:
Faux de la première migration:
./gérer migrer myapp 0001 --faux
Rouleau avec le reste de migrations:
./gérer migrer myapp
Quand je suis tombé sur cette erreur, il avait une cause différente.
Dans mon cas, le Sud a en quelque sorte laissé dans ma DB temporaire table vide, qui est utilisé dans _remake_table(). Probablement que j'avais avorté une migration d'une manière que je n'aurais pas dû. Dans tous les cas, chaque nouvelle migration, lorsqu'il a appelé _remake_table(), a été de jeter l'erreur
sqlite3.pypysqlite2.dbapi2.OperationalError: table "_south_new_myapp_mymodel" already exists
, parce qu'il ne existent déjà et n'était pas censé être là.La _south_new bits semblait étrange pour moi, donc je l'ai consulté ma DB, vu le tableau
_south_new_myapp_mymodel
, grattais la tête, regarda Au sud de la source, a décidé qu'il était indésirable, est tombé de la table, et tout allait bien.Perform these steps in order may help you
:1) python manage.py schemamigration apps.appname --initial
Étape ci-dessus crée la migration de dossier par défaut.
2) python manage.py migrer des applications.appname --faux
génère un faux migration.
3) python manage.py schemamigration apps.appname --auto
Ensuite, vous pouvez ajouter des champs que vous le souhaitez et d'exécuter la commande ci-dessus.
4) python manage.py migrer des applications.appname
Si vous avez des problèmes avec votre modèle ne correspond pas à votre base de données, comme @pielgrzym, et que vous souhaitez migrer automatiquement la base de données pour correspondre à la dernière models.py fichier (et de suppression des données qui ne seront pas recréés par des luminaires au cours de
migrate
):Cela ne fera que supprimer et recréer les tables de base de données qui existent dans votre dernier
models.py
fichier, de sorte que vous pouvez avoir des ordures tables dans votre base de données à partir de la précédentesyncdb
s oumigrate
s. Pour se débarrasser de ceux-ci, précéder toutes ces migrations avec:Et si ça laisse encore quelques TRUCS qui traînent dans votre base de données, alors vous aurez à faire un
inspectdb
et de créer de lamodels.py
fichier (pour les tables et l'application que vous souhaitez effacer) avant de faire lasqlclear
et puis restaurer votre original models.py avant la création de la--initial
de la migration et de la migration vers elle. Tout cela pour éviter de déconner avec la saveur particulière de SQL de votre base de données.Si vous avez une base de données existante et de l'application, vous pouvez utiliser le sud de la commande de conversion
Cela doit être appliqué avant vous n'avez aucune modification à ce qui est déjà dans la base de données.
La convert_to_south commande ne fonctionne entièrement sur la première machine que vous exécutez sur. Une fois que vous avez commis la première migrations effectuées dans votre CV, vous devrez exécuter
./manage.py migrate myapp 0001 --fake
sur chaque machine dispose d'une copie de la base de code (assurez-vous qu'ils étaient à jour avec des modèles et des schémas d'abord).ref: http://south.readthedocs.org/en/latest/convertinganapp.html
Comme solution temporaire, vous pouvez commenter la création de la Table dans le script de migration.
Ou
Si la table ne contient pas de lignes (vide), puis envisager de supprimer le tableau ci-dessous. (Ce correctif n'est recommandée que si la table ne contient pas de lignes). Assurez-vous également que cette opération avant la createModel opération.
La solution(peut-être une solution temporaire).
eg.,.
Ce sera la liste de tous les migrations dans les premières requêtes sql. Vous pouvez choisir les questions que vous souhaitez exécuter en évitant la partie qui crée la table existante