2012-04-12 1 views
1

Ich habe mit meiner Entwicklungsdatenbank mucking und bin bereit, es in die Produktion zu verschieben. Ich habe einige Änderungen außerhalb von Rails vorgenommen, daher habe ich keine Migration für alle meine Änderungen. Ich weiß, dass ich rake db:schema:dump eine schema.rb-Datei generieren kann, aber kann ich das auf eine bereits aufgefüllte Produktionsdatenbank anwenden, ohne die Daten zu löschen? Ähnliches wie rake db:schema:load ohne die Daten zu löschen?Rake möglich db: Schema: Laden, ohne die Datenbank zu löschen

Wenn nicht, muss ich nur manuell die Migrationen erstellen, die die Produktions-DB auffangen würden? Wenn ich diese Migrationen mache, werden nicht alle zukünftigen Aufrufe an rake db:migrate auf der Dev-Box fehlschlagen, weil die Änderung in der Migration bereits in der Dev-DB existiert?

Antwort

1

Das Problem mit rake db:schema:load ist, dass es mit Nachdruck die Tabellen erstellen, welchen Sie in db/schema.rb sehen:

create_table :users, :force => true do |t| 
    # etc 
end 

Was würde ich empfehlen, dass Sie die fehlenden Migrationen erzeuge. Sie können Ihre lokale Entwicklerdatenbank reparieren, indem Sie die Zeitstempel manuell zur Tabelle schema_migrations hinzufügen. Das ist die Konsequenz, wenn Sie Ihr Schema manuell ändern.

ich persönlich immer sicher, dass rake db:migrate:reset (alle Tabellen löschen und von Grund auf neu migrieren) wird die gleiche db/schema.rb wie rake db:schema:dump würde produzieren. Jede Änderung im Datenbankschema muss durch eine Migration automatisiert werden. Sie könnten es sogar zu einem Teil Ihres CI-Skripts machen, indem Sie rake db:migrate:reset ausführen und dann bestätigen, dass db/schema.rb sich nicht von dem in der Quellcodeverwaltung geändert hat.

+0

Wie mache ich den Schritt: "Reparieren Sie Ihre lokale dev-Datenbank durch manuelle Zugabe der Zeitstempel zur schema_migrations-Tabelle"? –

+0

Wenn Sie eine Migration hinzufügen, beginnt sie mit einem Zeitstempel wie 'db/migrate/201204131212_create_users.rb'. Diese Zeitstempel sind in der Tabelle 'schema_migrations' gespeichert. Fügen Sie sie einfach mit Ihrem Lieblingswerkzeug in der Datenbank hinzu. – iain

+0

Also, wenn ich den Timestamp der 'schema_migrations' Tabelle hinzufügen und dann' db: migrate' ausführen, wird diese Migration nicht ausgeführt? –