webentwicklung-frage-antwort-db.com.de

Bei Django 1.7-Migrationen wird eine abgelegte Tabelle nicht neu erstellt. Warum?

Verwenden von Django 1.7-Migrationen.

Ich habe aus Versehen eine Tabelle in meiner Datenbank abgelegt. Ich ging davon aus, dass bei einer erneuten Migration die Tabelle neu erstellt werden würde, aber nein, Django sagt "Keine Migrationen anwenden".

Wie bekomme ich Django, um die Tabelle neu zu erstellen?

Ich bin gerannt:

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

Ich habe versucht, eine Änderung am Modell vorzunehmen und eine neue Migration auszuführen. Es wird lediglich angegeben, dass "Tabelle 'x.test_customer' nicht vorhanden ist". Dies ist zwar korrekt, aber ich hatte gehofft, dass die Tabelle neu erstellt würde.

33
Prometheus

Migrationen suchen nach Unterschieden in Ihren Modellen und wandeln diese dann in Aktionen um, die in SQL übersetzt werden. Es nicht synchronisiert automatisch das Datenbankschema mit Ihren Modellen, und es hat keine Möglichkeit zu wissen, dass Sie eine Tabelle gelöscht haben (es kennt keine manuellen Änderungen, da Sie eigentlich keine manuellen Änderungen vornehmen sollten) ändert sich. Das ist der Punkt)

Die Antwort? Eine manuelle Änderung erfordert auch eine manuelle Migration. Was Sie tun müssen, ist, einfach Ihre eigene Migration zu schreiben und South manuell mitzuteilen, dass die Tabelle neu erstellt werden soll. Es ist nicht sehr schwierig, Die Dokumente machen es ziemlich einfach. Mach einfach so etwas:

from Django.db import migrations, models

class Migration(migrations.Migration):

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

Sie können wahrscheinlich in die erste Migrationsdatei (die Datei, aus der das Modell ursprünglich erstellt wurde) sehen und fast alles kopieren. Dann müssen Sie die Migration wie gewohnt ausführen 

18
yuvi

Gehen Sie zu Ihrer Datenbank und suchen Sie die Tabelle Django_migrations. Löschen Sie alle Zeilen, bei denen app Ihrem App-Namen entspricht.

Dann wird eine makemigrations & migrate funktionieren.

49
J.Q

Eine andere Lösung habe ich gefunden und funktioniert perfekt:

In Django 1.7:

  1. Löschen Sie den Migrationsordner

  2. In der Datenbank: DELETE FROM Django_migrations WHERE app = 'app_name'.

    Alternativ können Sie diese Tabelle auch einfach abschneiden.

  3. python manage.py makemigrations

  4. python manage.py migrate --fake

In Django 1.9.5:

  1. Löschen Sie den Migrationsordner
  2. In der Datenbank: DELETE FROM Django_migrations WHERE app = 'app_name'.

    Alternativ können Sie diese Tabelle auch einfach abschneiden.

  3. python manage.py makemigrations app_name

  4. python manage.py migrate

Das funktioniert zu 100% für mich!

21
Raúl EL

Ich habe tatsächlich einen einfacheren Weg gefunden, dies zu tun. Sie fälschen, dass Sie das zurücksetzen, was nicht existiert, und dann die Migration durchführen. Wenn bei Ihrer Migration 0005 die Tabelle erstellt wurde:

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

Sollte danach gut sein!

Wenn Sie spätere überspringen müssen, tun Sie Folgendes:

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

Sollte danach gut sein!

6
johannestaas

Der einfachste Weg, dies auf Django> = 1.9 zu tun, besteht darin, Folgendes auszuführen:

./manage.py migrate app_name zero

Dadurch werden Ihre Tabellen entfernt und alle Migrationen zurückgesetzt.

2
yekta

Vollständiger Haftungsausschluss, dies ist in manchen Fällen eine destruktive Operation, und ich verwende es meistens, um Teile des Systems neu zu migrieren, ohne die Datenbank zu beeinträchtigen.  

Haben Sie es über die Tabelle Django_migrations versucht? Entfernen Sie einfach die Zeilen, die der App-Bezeichnung zugeordnet sind, sowie die betreffenden Migrationsnamen und löschen Sie diese Zeilen.

+----+-----------------------+----------------------------------------------------------+---------------------+
| 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 |
+----+-----------------------+----------------------------------------------------------+---------------------+

Wenn ich also homepage entfernen möchte, kann ich einfach die Zeilen 30, 31, 32 löschen.

Da Sie auch die Tabellen gelöscht haben, müssen Sie natürlich auch Django_content_type ändern:

+----+----------------------------------------+-----------------------+--------------------------------------+
| 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     |
+----+----------------------------------------+-----------------------+--------------------------------------+

Jetzt müssen Sie die Tabellen entfernen, die Sie zum erneuten Migrieren benötigen, indem Sie die Zeilen für diese Tabellen löschen.

Ich habe es benutzt, als die Zeit knapp war und wir eine schnelle, schmutzige Lösung brauchten oder wenn wir in der Entwicklung herumspielten.
Ich hoffe es hilft dir auch! 

2
kunl

In meinem Fall in Django 2.0.2 zum Wiederherstellen der abgelegten Tabelle musste ich meine Modelle in myapp kommentieren und dann mit --fake migrieren und meine Modelle entkommentieren und ohne --fake Etwas anders als raul antworten:

  1. Löschen Sie Ihre Migrationsdateien in Ihrer gewünschten App
  2. Danke an raul Antwort: In der Datenbank: DELETE FROM Django_migrations WHERE app = 'app_name'.
  3. kommentarcodes in models.py und all diese Modelle, die in views, signals und etc verwendet werden (um Fehler zu vermeiden).
  4. python manage.py makemigrations YOUR_APP_NAME
  5. python manage.py migrate --fake
  6. kommentieren Sie, was Sie in Schritt 3 kommentiert haben
  7. python manage.py makemigrations YOUR_APP_NAME
  8. ohne --fake : python manage.py migrate

Dies sollte das Problem einiger Benutzer lösen.

0
SirSaleh

OK, also habe ich mich nicht mit Migrationen herumgespielt. Anscheinend bekomme ich bei Migrationen immer wieder Probleme. In diesem Fall brachte mich der Versuch, Migrationen zu wiederholen, nirgends. Vielleicht hätte es nicht geholfen, dass es einige South-Vintage-Migrationen gab sowie das neuere 1.7-Zeug.

umwelt: Postgres 9.3

Grundsätzlich habe ich eine alte Sicherung meiner Datenbank in eine leere Datenbank zurückgeschrieben. Dann habe ich das Wiederherstellungsziel im Postgres-Admin-Dienstprogramm aufgerufen und die Create-Tabellen aus jeder Tabellenbeschreibung kopiert/eingefügt (ich hatte nur noch 4 zu erledigen). Zu meiner Testdatenbank gewechselt und im pg-Dienstprogramm sql ausgeführt.

Ich weiß nicht, dass es nicht unvernünftig ist, einen Tisch manuell zu löschen, wenn Sie Probleme damit haben (sah aus, als ob meine ID-Sequenz nicht funktioniert), solange Sie mit dem Verlust Ihrer Daten leben können. Migrationen sollten in diesem Anwendungsfall belastbar sein.

0
JL Peyret

Ich bin gerade dabei gewesen, während ich eine kleine App gebaut habe, die Django lernt. Ich wollte eine Nicht-Null-Spalte für eine vorhandene Tabelle erstellen. Es gab drei Schritte:

  1. lass den Tisch fallen
  2. entferne den Datensatz in Django_migrations
  3. entfernen Sie die Migration für die betreffende Tabelle
    • wenn Sie vor diesem Schritt "python manage.py makemigrations posts" ausführen, wird immer noch das "Sie versuchen, ein nicht-nullbares Feld hinzuzufügen" angezeigt.

Für eine tatsächliche Anwendung müssen Sie einen Standardwert angeben, wie von anderen angegeben.

0
techbrownbags