Frage

Ich muss Änderungen an einem in Betrieb befindlichen Produktionsdatenbank machen. Nur Zugabe von ein paar Spalten. Ich habe die Änderungen in der Entwickler-Datenbank mit Migrationen gemacht. Was ist der beste Weg, um die Produktionsdatenbank zu aktualisieren, während der vorhandenen Daten zu erhalten und nicht zu viel stören Betrieb?

Es ist MYSQL und ich werde benötigt werden, um Daten für bereits vorhandene Datensätze als auch die Spalte hinzuzufügen. Eine Spalte kann einen Standardwert hat (es ist boolean), aber der andere ist ein Zeitstempel und sollte einen beliebigen rückwirkenden Wert hat. Die Reihe zählt, ist nicht sehr groß.

Wenn ich also Migrationen verwenden, wie füge ich Daten und wie bekomme ich es tun, nur die zwei (oder drei - ich hinzufügen Daten -latest Migrationen auf die Produktion db, wenn es nicht von Anfang an über Migrationen gebaut wurde (ich glaube, sie verwendet, um das Schema statt)?

War es hilfreich?

Lösung

Es klingt wie Sie in einem Zustand sind, wo die Produktion db Schema nicht genau übereinstimmt, was Sie in dev verwenden (auch wenn es nicht ganz klar ist). Ich würde eine Linie in dem Sand, zeichnen und diesen prod db in einem besseren Zustand erhalten. Im Wesentlichen, was Sie tun wollen, ist sicher, dass die prod db eine „schema_info“ Tabelle, die alle Migrationen aufgeführt, die Sie> nicht

Wenn Sie das getan haben Sie Migrationen, die Schemaänderungen hinzufügen schreiben oder Daten hinzufügen, aber eine Sache, die Sie wirklich brauchen, vorsichtig zu sein über das ist, wenn Sie Daten über eine Migration hinzufügen, können Sie das Modell in der Migration definieren muss sich , wie folgt:

class AddSomeColumnsToUserTable < ActiveRecord::Migration
  class User < ActiveRecord::Base; end
  def self.up
    add_column :users, :super_cool, :boolean, :default => :false
    u = User.find_by_login('cameron')
    u.super_cool = true
    u.save
  end

  def self.down
    remove_column :users, :super_cool
  end
end

Der Grund dafür ist, dass in der Zukunft, können Sie das Modell sogar komplett löschen, während einige Refactoring oder andere. Wenn Sie nicht über die Benutzerklasse auf Linie definieren „User.find_by_login ...“ die Migration wird eine Ausnahme werfen, die ein großer Schmerz ist.

Andere Tipps

Ich folge immer vor:

  • Dump prod Datenbank mit mysqldump Befehl
  • Bestücken dev / Test-Datenbank mit dump mit mysql Befehl
  • Ausführen Migrationen in dev / test
  • Überprüfen Sie die Migration gearbeitet
  • Dump prod Datenbank mit mysqldump Befehl (wie es geändert hat) halte Sicherung auf dem Server
  • Ausführen Migrationen auf prod (mit Capristano)
  • Test Migration auf prod gearbeitet
  • Getränk Bier (während Sie Fehlerprotokolle)

Gibt es einen Grund, warum Sie nicht die gleichen Migrationen verwenden Sie in Ihrer dev Umgebung verwendet?

sollte eine Spalte mit add_column in einer Migration Hinzufügen von nicht-destruktiv: es wird erzeugen ein „ALTER TABLE“ Anweisung. Wenn Sie wissen, was Sie gehen in die Spalten setzen einmal erstellt, können Sie die Werte innerhalb der Migration füllen können (Sie können eine weniger zeitraubend Alternative wählen, wenn die Zeilenanzahl groß sind).

Entfernen oder die Definition einer Spalte zu ändern ist, glaube ich, plattformabhängig: einige Löschen einer Spalte an Ort und Stelle ermöglichen, wird führen andere eine Umbenennungs-create-select-Drop-Befehlsfolge

.

Um genauer zu erhalten, brauchen wir mehr Informationen: welche Art von Migration betrachten Sie, welche Plattform Sie laufen auf, müssen Sie Werte als Teil der Migration setzen? Sachen wie das würde viel helfen -. Nur die Frage bearbeiten, die sie vorantreiben wird auf der Liste zurück

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top