2009-06-17 13 views
20

Fügt Rake db: migrate nur neue Migrationen hinzu oder werden alle Migrationen/Änderungen gelöscht und alles neu erstellt?genau was macht Rake db: Migration tun?

Ich denke Rake wirft einen Fehler, weil es versucht, auf ein Tabellenattribut in Migration 040 zuzugreifen, die in Migration 042 gelöscht wurde. Irgendwie sind meine DB und Rake nicht synchron und ich möchte sie beheben.

für Sie Experten da draußen - ist es üblich, dass Rake nicht synchron mit Migrationen ist? Wie kann ich das vermeiden (nein, ich bearbeite meine Schema- oder Rake-Dateien nicht manuell).

Antwort

14

Jedes Mal, wenn Sie eine Migration mithilfe von Skripts (wie Skript/Modell erstellen ...) erstellen, wird dem korrekten Verzeichnis eine neue Migration hinzugefügt, die mit der realen Datenbank synchronisiert werden kann.

Eigentlich überprüft Rake db: migrate nur, welche fehlenden Migrationen noch auf die Datenbank angewendet werden müssen, ohne sich um die vorherigen kümmern zu müssen.

Natürlich, wenn Sie die Datenbank auf andere Weise ändern, ist es üblich, nicht synchronisierte Dinge zu erhalten, denn wie Sie gesagt haben, können Sie eine Migration auf etwas anwenden, das darunter geändert wird.

21

Wenn Sie Rails-Migrationen verwenden, wird automatisch eine Tabelle mit dem Namen schema_migrations erstellt, die nachverfolgen kann, welche Migrationen angewendet wurden, indem die Versionsnummer jeder Migration gespeichert wird (dies ist die Nummer, die dem Migrationsnamen im Dateinamen vorangestellt ist) , dh db/migrate/_20090617111204__migration.rb). Wenn Sie rake db:migrate ausführen, um zu migrieren, werden nur Migrationen ausgeführt, die zuvor nicht ausgeführt wurden (dh ihre Version ist nicht in der Tabelle enthalten). Aus diesem Grund hat das Ändern einer bereits ausgeführten Migration keine Auswirkungen, wenn db:migrate ausgeführt wird). Bei der Migration werden alle Versionen in schema_migrations rückgängig gemacht, die größer als die Version sind, in die Sie zurückrollen.

+2

Gott sei Dank, diese Antwort legte mehr Details für mich. Warum sind schema_migrations nirgendwo in der db: Dokumentation migrieren? Es war das fehlende Stück zu meinem Verständnis des Systems in Bezug darauf, wie Schienen "herausfinden, welche Migrationen ausgeführt werden sollten"! –

5

Eine Migration bedeutet, dass Sie von der aktuellen Version zu einer neueren Version wechseln (wie in der ersten Antwort gesagt). Wenn Sie rake db: migrate verwenden, können Sie alle neuen Änderungen auf Ihr Schema anwenden. Wenn Sie jedoch zu einer früheren Migration zurückkehren möchten, können Sie mit Rake db: rollback die neuen Änderungen rückgängig machen, wenn sie falsch definiert sind. Vorsicht: Dadurch gehen Ihre Daten verloren.