Ich habe fälschlicherweise eine Spalte hased_password
anstelle von hashed_password
benannt.
Wie aktualisiere ich das Datenbankschema und benutze die Migration, um diese Spalte umzubenennen?
rename_column :table, :old_column, :new_column
Update:
Möglicherweise möchten Sie dazu eine separate Migration erstellen. (Benennen Sie FixColumnName wie gewünscht um.)
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
Die Methoden up
und down
gelten weiterhin. Rails 3.1 erhält eine change
-Methode, mit der "die Datenbank migriert und rückgängig gemacht werden kann, wenn die Migration rückgängig gemacht 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 umbenennen möchten oder etwas, das den Tabellennamen immer und immer wieder wiederholen müsste.
rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...
Sie könnten change_table
verwenden, 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
Danke, Luke
&& Turadg
, für das Aufrufen des Themas.
Dann db:migrate
wie gewohnt oder wie auch immer Sie sich um Ihr Geschäft kümmern.
Ein Update für Rails 4
Beim Erstellen einer Migration
für das Umbenennen einer Spalte generiert Rails 4 eine change
-Methode anstelle von up
und down
, wie in der obigen Antwort erwähnt. Die generierte change
-Methode sieht wie folgt aus:
$ > 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
IMO, in diesem Fall besser rake db:rollback
verwenden. Bearbeiten Sie dann die Migration und geben Sie erneut rake db:migrate
ein. Wenn Sie jedoch Daten in der Spalte haben, die Sie nicht verlieren möchten, verwenden Sie rename_column
.
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 Typ und Inhalt bei.
Wenn die Spalte bereits mit Daten gefüllt ist und sich in der Produktion befindet, würde ich eine schrittweise Vorgehensweise empfehlen, um Ausfallzeiten in der Produktion zu vermeiden, während auf die Migrationen gewartet wird.
Zuerst würde ich eine Datenbankmigration erstellen, um Spalten mit den neuen Namen hinzuzufügen und sie mit den Werten aus dem alten Spaltennamen 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 festlegen und die Änderung in die Produktion bringen.
git commit -m 'adding columns with correct name'
Sobald das Commit in die Produktion getrieben wurde, würde ich laufen.
Production $ bundle exec rake db:migrate
Dann würde ich alle Ansichten/Controller, die auf den alten Spaltennamen verweisen, auf den neuen Spaltennamen aktualisieren. Führen Sie meine Testsuite durch und übernehmen Sie diese Änderungen. (Nachdem Sie sich vergewissert haben, dass es lokal funktioniert hat und alle Tests zuerst bestanden haben!)
git commit -m 'using correct column name instead of old stinky bad column name'
Dann würde ich das Commit zur Produktion drängen.
An dieser Stelle können Sie die ursprüngliche Spalte entfernen, ohne sich um etwaige Ausfallzeiten für die Migration zu kümmern.
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 die Produktion und führen Sie bundle exec rake db:migrate
im Hintergrund aus.
Mir ist klar, dass dies ein bisschen mehr mit einem Prozess zu tun hat, aber ich würde dies lieber tun, als Probleme bei meiner Produktionsmigration zu haben.
Führen Sie den folgenden Befehl aus, um eine Migrationsdatei zu erstellen:
Rails g migration ChangeHasedPasswordToHashedPassword
Dann schreiben Sie in der Datei, die im Ordner db/migrate
generiert wurde, rename_column
wie folgt:
class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
Von API:
rename_column(table_name, column_name, new_column_name)
Es benennt eine Spalte um, behält jedoch den Typ und den Inhalt bei.
Einige Versionen von Ruby on Rails unterstützen die Up/Down-Methode für die Migration. Wenn Sie bei der Migration eine Up/Down-Methode verwenden, gilt Folgendes:
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
-Methode in Ihrer Migration verwenden, gilt Folgendes:
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.
Wenn Ihr Code nicht mit einem anderen Code geteilt wird, ist es am besten, nur rake db:rollback
Zu bearbeiten und dann den Spaltennamen in der Migration und rake db:migrate
zu bearbeiten. Das ist es
Sie können eine weitere Migration zum Umbenennen der Spalte schreiben
def change
rename_column :table_name, :old_name, :new_name
end
Das ist es.
Wenn Sie die Spaltennamen wechseln müssen, müssen Sie einen Platzhalter erstellen, um einen doppelten Spaltennamen error zu vermeiden. 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
Wenn die vorliegenden Daten für Sie nicht wichtig sind, können Sie Ihre ursprüngliche Migration einfach mit folgendem Befehl entfernen:
rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'
Nehmen Sie dann ohne Anführungszeichen Änderungen an der ursprünglichen Migration vor und führen Sie die Up-Migration erneut durch:
rake db:migrate
Wenn Sie nicht mit der Idee von Migrationen verheiratet sind, gibt es für ActiveRecord ein interessantes Kleinod, das die Namensänderungen automatisch für Sie behandelt, im 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 Ihres Modells.rb) und Viola! Die Datenbank wird im laufenden Betrieb aktualisiert.
https://github.com/DAddYE/mini_record
Hinweis: Sie müssen db/schema.rb abschalten, um Konflikte zu vermeiden
Noch in Beta-Phase und offensichtlich nicht für jedermann, aber immer noch eine überzeugende Wahl (ich verwende es derzeit in zwei nicht-trivialen Produktions-Apps ohne Probleme).
Für Ruby on Rails 4:
def change
rename_column :table_name, :column_name_old, :column_name_new
end
Erstellen Sie einfach eine neue Migration und verwenden Sie rename_column
in einem Block wie folgt.
rename_column :your_table_name, :hased_password, :hashed_password
Manuell können wir die folgende Methode verwenden:
Wir können die Migration manuell bearbeiten wie:
app/db/migrate/xxxxxxxxx_migration_file.rb
öffnen
hased_password
auf hashed_password
aktualisieren
Führen Sie den folgenden Befehl aus
$> rake db:migrate:down VERSION=xxxxxxxxx
Dann wird die Migration entfernt:
$> rake db:migrate:up VERSION=xxxxxxxxx
Ihre Migration wird mit der aktualisierten Änderung hinzugefügt.
Führen Sie Rails g migration ChangesNameInUsers
aus (oder wie auch immer Sie es benennen möchten)
Öffnen Sie die soeben erstellte Migrationsdatei und fügen Sie diese Zeile in die Methode ein (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 Ihren schema.db
, um zu sehen, ob sich der Name tatsächlich in der Datenbank geändert hat!
Hoffe das hilft :)
Generiere 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
$: Rails g migration RenameHashedPasswordColumn
invoke active_record
create db/migrate/20160323054656_rename_hashed_password_column.rb
Öffnen Sie diese Migrationsdatei und ändern Sie sie wie folgt (Geben Sie Ihren ursprünglichen table_name
ein).
class RenameHashedPasswordColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
def change
rename_column :table_name, :old_column_name, :new_column_name
end
Erzeugen Sie eine Ruby on Rails-Migration :
$:> Rails g migration Fixcolumnname
Code in die Migrationsdatei einfügen (XXXXXfixcolumnname.rb) :
class Fixcolumnname < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
Sie haben zwei Möglichkeiten, dies zu tun:
Bei diesem Typ wird beim Zurücksetzen automatisch der umgekehrte Code ausgeführt.
def change
rename_column :table_name, :old_column_name, :new_column_name
end
Bei diesem Typ wird die Up-Methode ausgeführt, wenn rake db:migrate
und die Down-Methode, wenn rake db:rollback
:
def self.up
rename_column :table_name, :old_column_name, :new_column_name
end
def self.down
rename_column :table_name,:new_column_name,:old_column_name
end
Öffnen Sie Ihre Ruby on Rails-Konsole und geben Sie Folgendes ein:
ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column
Ich bin bei Rails 5.2 und versuche, eine Kolumne eines devise-Benutzers umzubenennen.
das rename_column
-Bit hat bei mir funktioniert, aber der singuläre :table_name
hat einen Fehler "User table not found" ausgegeben. Plural arbeitete für mich.
Rails g RenameAgentinUser
Dann ändern Sie die Migrationsdatei folgendermaßen:
rename_column :users, :agent?, :agent
Wo: agent ist der alte Spaltenname.
Lassen Sie uns KISS . Alles was es braucht, sind drei einfache Schritte. Folgendes funktioniert für Rails 5.2.
Rails g migration RenameNameToFullNameInStudents
Rails g RenameOldFieldToNewFieldInTableName
- so ist es für Verwalter der Code-Basis später völlig klar. (Verwenden Sie einen Plural für den Tabellennamen).
# I prefer to explicitly write the
upand
downmethods.
# ./db/migrate/20190114045137_rename_name_to_full_name_in_students.rb
class RenameNameToFullNameInStudents < ActiveRecord::Migration[5.2]
def up
# rename_column :table_name, :old_column, :new_column
rename_column :students, :name, :full_name
end
def down
# Note that the columns are reversed
rename_column :students, :full_name, :name
end
end
rake db:migrate
Und du gehst zu den Rennen!
Generieren Sie einfach die Migration mit dem Befehl
Rails g migration rename_hased_password
Danach bearbeiten Sie die Migration folgende Zeile in der Änderungsmethode
rename_column :table, :hased_password, :hashed_password
Das sollte den Trick tun.
Änderungen bei der Migration von Rails 5
z.B:
Rails g-Modell Student student_name: Zeichenfolge Alter: Ganzzahl
wenn Sie die Spalte student_name als name ändern möchten
Hinweis: - Wenn Sie Rails db nicht ausführen: migrate
Sie können die folgenden Schritte ausführen
Rails d Modell Student student_name: Zeichenfolge Alter: Integer
Dadurch wird die generierte Migrationsdatei entfernt. Jetzt können Sie den Spaltennamen korrigieren
Rails g-Modell Name des Schülers: Alter der Zeichenfolge: Ganzzahl
Wenn Sie migriert haben (Rails db: migrate), folgen Sie den Optionen zum Ändern des Spaltennamens
Migration von Rails g RemoveStudentNameFromStudent student_name: Zeichenfolge
Migration von Rails g AddNameToStudent: Zeichenfolge