2009-05-08 6 views
16

Ich habe "rake db: migrate" ausgeführt, um schema.db mit meinem Datenbankschema neu zu synchronisieren. Aber es ist fehlgeschlagen und hat gesagt, dass einer meiner Tische bereits existiert. Ich denke, es hat versucht, den Tisch neu zu erstellen. Wenn Sie nur schema.rb aktualisieren möchten, um alle Änderungen widerzuspiegeln, die Sie unabhängig von Rails in der Datenbank vorgenommen haben, welchen Befehl sollten Sie verwenden, wenn nicht "rake db: migrate"? Und was ist die beste Quelle für Dokumentation über diese Art von Dingen?Ist Rake db: migrieren Sie den richtigen Befehl, um schema.rb erneut mit Ihrem Datenbankschema zu synchronisieren?

+1

Probieren Sie ** 'Rake db: schema: dump' ** und geben Sie dann Ihrem Editor ein paar Augenblicke, um die Dateiänderungen abzuholen. –

Antwort

17

"rake db: migrate" versucht alle ausstehenden Migrationen für Ihr Projekt auszuführen. Wenn Sie nur das Schema ausgeben wollen, machen Sie ein "Rake db: schema: dump".
Aber ich denke, Sie haben ein Problem, wo es heißt, dass die Tabelle bereits existiert. Eine Ihrer Migrationen schlägt fehl, da die Tabelle, die sie hinzuzufügen versucht, bereits in Ihrer Datenbank vorhanden ist. Hast du eines von Hand erstellt? Haben Sie eine Migration abgeschrieben, aber haben Sie kein Down geschrieben? Sie müssen dies beheben, bevor Sie zukünftige Migrationen schreiben können. Wenn es nur ein Fehler ist, und der Tisch ist da und richtig und du willst das ignorieren. Ich empfehle es, das Problem zu umgehen, indem ich die create-Tabelle in der fehlgeschlagenen Migration auskommentiere. Führen Sie dann "rake db: migrate" aus. Dann aber die Tabelle erstellen zurück. Dadurch wird Ihre Schemaversion aktualisiert.
Stellen Sie sicher, dass Sie bei allen Migrationen korrekte Einstellungen vornehmen.

+0

Gute Erklärung. Vielen Dank. – drizzle

2

Versuchen Sie rake db:schema:dump oder .

14

ich gefunden habe, dass Gelegentlich, wenn die Dinge ein wenig merkwürdig werden, werden Sie sich in einer Situation befinden, in der Rails eine Migration durchführen möchte, die sie zu Recht in Erwägung ziehen sollte (die Tabelle existiert bereits usw.). Sie können eine Migration markieren, wie von der Suche nach seiner Nummer (die Nummer Teil am Anfang des Dateinamens) getan, gehen in mysql und die Ausgabe einer Abfrage wie folgt:

insert into schema_migrations values('20090521153438'); 

(oder was auch immer die Zahl der Migration ist)

Oder wenn es ein Plugin Migration ist Lauf mit Wüste des migrate_plugin ist:

insert into plugin_schema_migrations values('my_plugin', '005'); 
+0

Danke für den Tipp. – Espen

+1

Gute Trauer, danke dafür! Dies ist die einzige Lösung, die ich gesehen habe, die nicht ** alle Ihre Daten ** löscht. Verwenden Sie dies, wenn Sie Daten in Tabellen haben, die Sie nicht löschen möchten :) – FireDragon

+1

ein anderer, wenn Hacky, Taktik ist der Körper der anstößigen Migration auskommentieren und dann migrieren. – hoff2

17

Versuchen

RAILS_ENV=development rake db:drop 

vor

RAILS_ENV=development rake db:migrate 

und glücklich sein!

Sicherzustellen, dass Sie es auf Ihrem Test- oder Entwicklungsumgebung ausführen, da dies die Datenbank/Tabellen

+0

Das funktionierte für mich: Rake db: drop –

+3

Rake db: Drop löscht alle Ihre Tabellen, so dass der nächste Rake db: migrate von vorne anfangen wird und alle Migrationen anwenden – timkay

+8

vielleicht ist dies das gleiche wie 'rake db: migrate: reset' ? – lulalala

6

rake db:migrate:reset Ihre Tabellen alle sinkt fallen wird, alle Migrationen laufen und eine neue schema.rb Datei erstellen.

2

Verwendung rake db:schema:dump.

$ rake -T | grep schema 
rake db:schema:dump # Create a db/schema.rb file that is portable 
        # against any database supported by ActiveRecord 

rake db:schema:dump neu erstellt die Datei db/schema.rb ohne wieder alle Ihre Migrationen zu laufen oder fallen alle Tabellen (was impliziert, die Daten in diesen Tabellen zu verlieren), so ist es die am wenigsten invasive Art und Weise Sie zunächst versuchen können.

Verwandte Themen