ruby-on-rails - name - remove_column rails migration
Wie kann ich eine Datenbankspalte in einer Ruby-on-Rails-Migration umbenennen? (16)
Öffnen Sie Ihre Ruby on Rails-Konsole und geben Sie Folgendes ein:
ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column
Ich habe fälschlicherweise eine Spalte hased_password
anstelle von hashed_password
.
Wie aktualisiere ich das Datenbankschema mithilfe der Migration, um diese Spalte umzubenennen?
Als eine alternative Option, wenn Sie nicht mit der Idee von Migrationen verheiratet sind, gibt es ein überzeugendes 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 Model.auto_upgrade! Am unteren Rand Ihrer model.rb) und Viola! Die Datenbank wird im laufenden Betrieb aktualisiert.
https://github.com/DAddYE/mini_record
Hinweis: Um Konflikte zu vermeiden, müssen Sie db / schema.rb nuke
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)
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 Sie die change
in Ihrer Migration haben, 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 Active Record Migrationen .
Erstellen Sie einfach eine neue Migration und verwenden Sie in einem Block rename_column
wie rename_column
.
rename_column :your_table_name, :hased_password, :hashed_password
Für Ruby on Rails 4:
def change
rename_column :table_name, :column_name_old, :column_name_new
end
Generieren Sie die Migration einfach mit dem Befehl
rails g migration rename_hased_password
Danach bearbeiten Sie die Migration fügen Sie folgende Zeile in der Änderungsmethode hinzu
rename_column :table, :hased_password, :hashed_password
Dies sollte den Trick machen.
Manuell können wir die folgende Methode verwenden:
Wir können die Migration manuell wie folgt bearbeiten:
Öffnen Sie die
app/db/migrate/xxxxxxxxx_migration_file.rb
Aktualisieren Sie
hased_password
zuhashed_password
Führen Sie den folgenden Befehl aus
$> rake db:migrate:down VERSION=xxxxxxxxx
Dann wird Ihre Migration entfernt:
$> rake db:migrate:up VERSION=xxxxxxxxx
Es fügt Ihre Migration mit der aktualisierten Änderung hinzu.
Run rails g migration ChangesNameInUsers
(oder wie auch immer Sie es benennen möchten)
Öffnen Sie die gerade generierte Migrationsdatei und fügen Sie diese Zeile in der Methode hinzu (zwischen def change
und end
):
rename_column :table_name, :the_name_you_want_to_change, :the_new_name
Speichern Sie die Datei und führen Sie rake db:migrate
in der Konsole aus
Überprüfen Sie Ihre schema.db
um zu sehen, ob sich der Name tatsächlich in der Datenbank geändert hat!
Hoffe das hilft :)
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.
Wenn Ihr Code nicht mit anderen geteilt wird, dann ist die beste Option, einfach rake db:rollback
dann bearbeiten Sie Ihren Spaltennamen in 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.
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 auf die Produktion und führen 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.
Wenn die vorliegenden Daten für Sie nicht wichtig sind, können Sie die ursprüngliche Migration einfach mit den folgenden Methoden abbauen:
rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'
Ohne die Anführungszeichen, nehmen Sie Änderungen an der ursprünglichen Migration vor und führen Sie die Hochmigration erneut durch:
rake db:migrate
Erstellen Sie eine Ruby-on-Rails-Migration :
$:> rails g migration Fixcolumnname
Fügen Sie Code in die Migrationsdatei ein (XXXXXfixcolumnname.rb) :
class Fixcolumnname < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
Generieren Sie die Migrationsdatei:
rails g migration FixName
# Erstellt db / migrate / xxxxxxxxxx.rb
Bearbeiten Sie die Migration, um Ihren Willen zu erfüllen.
class FixName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
def change
rename_column :table_name, :old_column_name, :new_column_name
end
$: rails g migration RenameHashedPasswordColumn
invoke active_record
create db/migrate/20160323054656_rename_hashed_password_column.rb
Öffnen Sie diese Migrationsdatei und ändern Sie diese Datei wie table_name
( table_name
Sie Ihren ursprünglichen table_name
)
class RenameHashedPasswordColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end