Django 1.7 migrations ne recréera pas une table tombée, pourquoi?

utilisant Django 1.7 migrations.

j'ai accidentellement fait tomber une table dans ma base de données. J'ai supposé qu'en dirigeant à nouveau la migration, cela recréerait la table mais non, Django déclare "aucune migration à appliquer".

Comment faire pour que Django recrée la table?

j'ai:

> makemigrations - No changes detected
> migrate - No migrations to apply.

j'ai essayé de faire un changement au Modèle et d'exécuter une nouvelle migration et il est simplement dit que "Table' X. test_customer 'n'existe pas" ce qui est correct, mais ce que j'espérais pour recréer la table.

30
demandé sur Prometheus 2014-11-03 14:24:26

8 réponses

Migrations vérifiez les différences dans vos modèles, puis traduisez cela en actions, qui sont traduites en SQL. ne pas synchroniser automatiquement le schéma db avec vos modèles, et il n'y a aucun moyen de savoir que vous avez fait tomber une table (il n'est pas au courant des changements manuels parce que, bien, vous n'êtes pas censé faire des changements manuels. C'est le point)

La réponse? un changement manuel nécessite une migration manuelle aussi bien. Ce que vous devez faire est de simplement écrire votre propre migration et dites à South de reconstruire la table. Il n'est pas très difficile, La documentation c'est assez facile. Juste faire quelque chose comme ceci:

from django.db import migrations, models

class Migration(migrations.Migration):

    operations = [
        migrations.CreateModel("Foo"),
        migrations.AddField("Foo", "bar", models.IntegerField(default=0))
    ] 

Vous pouvez regarder dans le premier fichier de migration (celui qui fait le modèle en premier lieu) et de copier coller presque tous. Alors tout ce que vous avez à faire est de gérer la migration comme vous le faites toujours

17
répondu yuvi 2014-11-03 11:37:20

allez dans votre base de données et trouvez la table django_migrations. Supprimer toutes les lignes qui ont app égale votre nom d'application.

alors faites un fonctionne.

46
répondu J.Q 2016-01-12 18:57:41

une Autre solution que j'ai trouvé et fonctionne parfaitement:

Dans django 1.7:

  1. supprimer votre dossier migrations

  2. Dans la base de données: DELETE FROM django_migrations WHERE app = 'app_name'.

    vous pouvez aussi simplement tronquer cette table.

  3. python manage.py makemigrations

  4. python manage.py migrate --fake

Dans django 1.9.5:

  1. supprimer vos migrations dossier
  2. Dans la base de données: DELETE FROM django_migrations WHERE app = 'app_name'.

    vous pouvez aussi simplement tronquer cette table.

  3. python manage.py makemigrations app_name

  4. python manage.py migrate

Cela fonctionne à 100% pour moi!

19
répondu Raúl EL 2016-04-12 07:18:19

j'ai effectivement trouvé un moyen plus facile de le faire. Tu simules que tu fais reculer ce qui n'existe pas, puis tu ré-émigres. Si votre migration 0005 était celui où il crée la table:

python manage.py migrate myapp --fake 0004
python manage.py migrate myapp

Devrait être bon après ça!

Si vous avez besoin de sauter plus tard, vous faire ceci:

python manage.py migrate myapp --fake 0004
python manage.py migrate myapp 0005
python manage.py migrate myapp --fake

Devrait être bon après ça!

6
répondu johannestaas 2014-12-14 02:24:44

mise en garde complète, il s'agit d'une opération destructive dans certains cas, et je l'utilise principalement pour remigrer des parties du système sans affecter le DB.

Avez-vous essayé de le faire via la table django_migrations? Il suffit de supprimer les lignes qui correspondent à l'étiquette app et les noms de migration en question et de supprimer ces lignes.

+----+-----------------------+----------------------------------------------------------+---------------------+
| id | app                   | name                                                     | applied             |
+----+-----------------------+----------------------------------------------------------+---------------------+
|  1 | contenttypes          | 0001_initial                                             | 2015-03-07 16:32    |
| 30 | homepage              | 0001_initial                                             | 2015-04-02 13:30:44 |
| 31 | homepage              | 0002_auto_20150408_1751                                  | 2015-04-08 12:24:55 |
| 32 | homepage              | 0003_remove_mappinghomepagemoduleinventory_inventoryinfo | 2015-04-09 08:09:59 |
+----+-----------------------+----------------------------------------------------------+---------------------+

alors maintenant si je veux enlever homepage, je peux supprimer les lignes 30, 31, 32.

bien sûr Depuis que vous avez fait tomber les tableaux aussi, vous aurez besoin de changer django_content_type aussi:

+----+----------------------------------------+-----------------------+--------------------------------------+
| id | name                                   | app_label             | model                                |
+----+----------------------------------------+-----------------------+--------------------------------------+
|  1 | content type                           | contenttypes          | contenttype                          |
|  2 | session                                | sessions              | session                              |
|  3 | site                                   | sites                 | site                                 |
| 92 | master_homepagemodule_extrafields      | homepage              | masterhomepagemoduleextrafields      |
| 93 | mapping_homepagemodule_inventory       | homepage              | mappinghomepagemoduleinventory       |
| 94 | master_homepagemodule_inventoryfields  | homepage              | masterhomepagemoduleinventoryfields  |
| 95 | mapping_homepagemodule_inventoryfields | homepage              | mappinghomepagemoduleinventoryfields |
| 96 | master_homepagemodule                  | homepage              | masterhomepagemodule                 |
| 97 | mapping_homepagemodule_extrafields     | homepage              | mappinghomepagemoduleextrafields     |
+----+----------------------------------------+-----------------------+--------------------------------------+

donc maintenant vous devez supprimer les tables que vous avez besoin de remigrer besoin en laissant tomber les lignes pour ces tables.

j'ai utilisé ceci quand le temps était rare et que nous avions besoin d'une correction rapide, ou quand nous jouions dans le développement.

Espérons qu'il vous aide aussi!

2
répondu kunl 2015-04-14 14:46:13

la façon la plus simple de faire ceci sur django >= 1.9 est d'exécuter ce qui suit:

./manage.py migrate app_name zero

qui supprimera vos tables et renverra toutes les migrations.

1
répondu yekta 2017-01-06 11:10:29

OK, donc ce que j'ai fait c'était de ne pas jouer avec les migrations. On dirait que j'ai de temps en temps des problèmes avec les migrations. Et dans ce cas, essayer de rejouer les migrations ne m'a mené nulle part. Ça n'aurait pas aidé qu'il y ait des migrations Sud-vintage aussi bien que le nouveau 1.7 truc.

environnement: postgresql 9.3

en gros, j'ai restauré une vieille sauvegarde de ma base de données dans une base de données vide. Puis j'ai soulevé la cible de restauration dans l'admin postgres utilitaire et copié / collé les tables créer à partir de la description de chaque table (je n'avais que 4 à faire). Je suis passé à ma base de données de test et je l'ai lancé dans l'utilitaire sql de pg.

Je ne sais pas, Je ne pense pas qu'il soit déraisonnable de laisser tomber une table manuellement si vous avez des problèmes avec elle (j'ai eu l'impression que la séquence de mon champ d'identification ne fonctionnait pas), tant que vous pouvez vivre avec la perte de vos données. Les Migrations devraient être résistantes dans ce cas.

0
répondu JL Peyret 2015-03-04 00:59:02

Dans mon cas django 2.0.2 de recréer la table supprimée j'ai dû commenter mes modèles dans myapp et puis migrer --fake et supprimez les marques de mes modèles et de migrer sans --fake Un peu différent de raul réponse:

  1. Supprimer les migrations des fichiers dans votre application souhaitée
  2. Grâce à raul réponse: Dans la base de données: DELETE FROM django_migrations WHERE app = 'app_name'.
  3. codes de commentaire dans models.py et tous ces modèles d'utilisation en views,signals et etc (à éviter les erreurs).
  4. python manage.py makemigrations YOUR_APP_NAME
  5. python manage.py migrate --fake
  6. dé-commentez ce que vous avez dit dans l'étape 3
  7. python manage.py makemigrations YOUR_APP_NAME
  8. migrer sans --faux:python manage.py migrate

ceci devrait résoudre certains problèmes d'utilisateurs.

0
répondu SirSaleh 2018-09-13 11:05:47