Frage Wie kann ich eine Datenbankspalte in einer Ruby-on-Rails-Migration umbenennen?


Ich habe fälschlicherweise eine Kolumne benannt hased_password Anstatt von hashed_password.

Wie aktualisiere ich das Datenbankschema mithilfe der Migration, um diese Spalte umzubenennen?


1280
2018-01-02 16:18


Ursprung


Antworten:


rename_column :table, :old_column, :new_column

Aktualisieren:

Wahrscheinlich möchten Sie dazu eine separate Migration erstellen. (Benenne FixColumnName wie du willst)

script/generate migration FixColumnName
# creates  db/migrate/xxxxxxxxxx_fix_column_name.rb

Bearbeiten Sie dann die Migration, um Ihren Willen zu erfüllen.

# db/migrate/xxxxxxxxxx_fix_column_name.rb
class FixColumnName < ActiveRecord::Migration
  def self.up
    rename_column :table_name, :old_column, :new_column
  end

  def self.down
    # rename back if you need or do something else or do nothing
  end
end

Ein Update für Rails 3.1

Während up und down Methoden gelten noch immer. Schienen 3.1 erhält a change Methode das "weiß, wie Sie Ihre Datenbank migrieren und sie rückgängig machen können, wenn die Migration zurückgesetzt wird, ohne dass eine separate Down-Methode geschrieben werden muss"

rails g migration FixColumnName

class FixColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

Wenn Sie eine ganze Reihe von Spalten haben, die umbenannt werden müssen, oder etwas, das es erforderlich gemacht hätte, den Tabellennamen immer wieder zu wiederholen.

rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...

Du könntest benutzen change_table um die Dinge ein wenig sauberer zu halten.

class FixColumnNames < ActiveRecord::Migration
  def change
    change_table :table_name do |t|
      t.rename :old_column1, :new_column1
      t.rename :old_column2, :new_column2
      ...
    end
  end
end

Vielen Dank, Luke && Turadg, um das Thema aufzubringen.

Dann einfach db:migrate wie immer oder wie auch immer Sie Ihre Geschäfte machen.


Ein Update für Rails 4

Beim Erstellen eines Migration Wie beim Umbenennen einer Spalte erzeugt Rails 4 a change Methode statt up und down wie in der obigen Antwort erwähnt. Das erzeugte change Methode ist wie folgt:

$ > rails g migration ChangeColumnName

Dadurch wird eine ähnliche Migrationsdatei erstellt:

class ChangeColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

2081
2018-01-02 16:31



IMO, in diesem Fall, besser verwenden rake db:rollback. Bearbeiten Sie anschließend Ihre Migration und geben Sie sie erneut ein rake db:migrate. Wenn Sie jedoch Daten in der Spalte haben, die Sie nicht verlieren möchten, verwenden Sie rename_column.


65
2018-01-03 00:55



http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

Unter Available Transformations

rename_column(table_name, column_name, new_column_name):

Benennt eine Spalte um, behält jedoch den Typ und den Inhalt bei.


26
2018-01-02 16:26



Wenn die Spalte bereits mit Daten gefüllt ist und in der Produktion läuft, würde ich eine schrittweise Vorgehensweise empfehlen, um Produktionsausfälle während des Wartens auf die Migrationen zu vermeiden.

Zuerst würde ich eine Datenbankmigration erstellen, um Spalten mit den neuen Namen hinzuzufügen und sie mit den Werten des alten Spaltennamens zu füllen.

class AddCorrectColumnNames < ActiveRecord::Migration
  def up
    add_column :table, :correct_name_column_one, :string
    add_column :table, :correct_name_column_two, :string

    puts 'Updating correctly named columns'
    execute "UPDATE table_name SET correct_name_column_one = old_name_column_one, correct_name_column_two = old_name_column_two"
    end
  end

  def down
    remove_column :table, :correct_name_column_one
    remove_column :table, :correct_name_column_two
  end
end

Dann würde ich genau diese Änderung vornehmen und den Wechsel in die Produktion bringen.

git commit -m 'adding columns with correct name'

Dann, sobald der Commit in Produktion gebracht wurde, würde ich laufen.

Production $ bundle exec rake db:migrate

Dann würde ich alle Ansichten / Controller, die den alten Spaltennamen referenzierten, auf den neuen Spaltennamen aktualisieren. Führen Sie meine Testsuite durch und übernehmen Sie nur diese Änderungen. (Nachdem sichergestellt wurde, dass es lokal funktioniert und alle Tests bestanden hat!)

git commit -m 'using correct column name instead of old stinky bad column name'

Dann würde ich dieses Commit in die Produktion schieben.

An dieser Stelle können Sie die ursprüngliche Spalte entfernen, ohne sich über irgendwelche Ausfallzeiten im Zusammenhang mit der eigentlichen Migration Gedanken machen zu müssen.

class RemoveBadColumnNames < ActiveRecord::Migration
  def up
    remove_column :table, :old_name_column_one
    remove_column :table, :old_name_column_two
  end

  def down
    add_column :table, :old_name_column_one, :string
    add_column :table, :old_name_column_two, :string
  end
end

Dann schieben Sie diese letzte Migration in Produktion und Ausführung bundle exec rake db:migrate im Hintergrund.

Mir ist klar, dass dies ein wenig mehr in einen Prozess involviert ist, aber ich würde das lieber tun, als Probleme mit meiner Produktionsmigration zu haben.


24
2017-08-30 22:08



Führen Sie den folgenden Befehl aus, um eine Migrationsdatei zu erstellen:

rails g migration ChangeHasedPasswordToHashedPassword

Dann in der Datei, die in der db/migrate Ordner, schreiben rename_column wie nachstehend:

class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
  def change
     rename_column :table_name, :hased_password, :hashed_password
  end
end

16
2017-12-03 11:45



Von der API:

rename_column(table_name, column_name, new_column_name)

Es benennt eine Spalte um, behält aber den Typ und Inhalt gleich.


13
2018-02-18 11:15



Einige Versionen von Ruby on Rails unterstützen die Up / Down-Methode für die Migration und wenn Sie eine Up / Down-Methode in Ihrer Migration haben, dann:

def up
    rename_column :table_name, :column_old_name, :column_new_name
end

def down
    rename_column :table_name, :column_new_name, :column_old_name
end

Wenn du das hast change Methode in Ihrer Migration, dann:

def change
    rename_column :table_name, :column_old_name, :column_new_name
end

Für weitere Informationen können Sie verschieben: Ruby on Rails - Migrationen oder Aktive Datensatzmigrationen.


12
2018-02-14 10:38



Wenn Ihr Code nicht mit einem anderen Code geteilt wird, ist die beste Option, einfach zu tun rake db:rollback Bearbeiten Sie dann Ihren Spaltennamen in der Migration und rake db:migrate. Das ist es

Und Sie können eine andere Migration schreiben, um die Spalte umzubenennen

 def change
    rename_column :table_name, :old_name, :new_name
  end

Das ist es.


10
2017-12-04 14:34



Wenn Sie die Spaltennamen ändern müssen, müssen Sie einen Platzhalter erstellen, um zu vermeiden doppelte Spaltennamen Fehler. Hier ist ein Beispiel:

class SwitchColumns < ActiveRecord::Migration
  def change
    rename_column :column_name, :x, :holder
    rename_column :column_name, :y, :x
    rename_column :column_name, :holder, :y
  end
end

8
2017-09-09 21:10



Als eine alternative Option, wenn Sie nicht mit der Idee von Migrationen verheiratet sind, gibt es ein attraktives Juwel für ActiveRecord, das die Namensänderungen automatisch für Sie übernimmt, Datamapper Stil. Alles, was Sie tun, ist den Spaltennamen in Ihrem Modell zu ändern (und stellen Sie sicher, dass Sie setzen Modell.auto_upgrade! an der Unterseite Ihres Models.rb) und Viola! Die Datenbank wird im laufenden Betrieb aktualisiert.

https://github.com/DAddYE/mini_record

Hinweis: Du musst einen Nuke machen db / schema.rb um Konflikte zu vermeiden

Immer noch in den Beta-Phasen und natürlich nicht für alle, aber immer noch eine zwingende Wahl (ich verwende es derzeit in zwei nicht trivialen Produktions-Apps ohne Probleme)


7
2018-01-30 20:00