Ich habe fälschlicherweise eine Spalte hased_password
anstelle von benannt hashed_password
.
Wie aktualisiere ich das Datenbankschema mithilfe der Migration, um diese Spalte umzubenennen?
quelle
Ich habe fälschlicherweise eine Spalte hased_password
anstelle von benannt hashed_password
.
Wie aktualisiere ich das Datenbankschema mithilfe der Migration, um diese Spalte umzubenennen?
rename_column :table, :old_column, :new_column
Möglicherweise möchten Sie dazu eine separate Migration erstellen. (Umbenennen 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
Für Rails 3.1 verwenden Sie:
Während die Methoden up
und down
weiterhin gelten, erhält Rails 3.1 eine change
Methode, die "weiß, wie Sie Ihre Datenbank migrieren und umkehren, wenn die Migration zurückgesetzt wird, ohne dass eine separate Down-Methode geschrieben werden muss".
Weitere Informationen finden Sie unter " Aktive Datensatzmigrationen ".
rails g migration FixColumnName
class FixColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
Wenn Sie zufällig eine ganze Reihe von Spalten umbenennen müssen oder etwas, bei dem der Tabellenname immer wieder wiederholt werden müsste:
rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...
Sie könnten verwenden change_table
, um die Dinge ein wenig ordentlicher 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
Dann db:migrate
wie gewohnt oder wie auch immer Sie Ihrem Geschäft nachgehen.
Für Schienen 4:
Beim Erstellen einer Migration
Spalte zum Umbenennen einer Spalte generiert Rails 4 change
anstelle von up
und down
wie im obigen Abschnitt erwähnt eine Methode . Die generierte change
Methode ist:
$ > rails g migration ChangeColumnName
Dadurch wird eine Migrationsdatei erstellt, die der folgenden ähnelt:
class ChangeColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
self.up
würde ich nicht sagenself.down
"sollte immer das Gegenteil sein". In hängt vom Kontext Ihrer Migration ab. Nur das "Gegenteil" zu setzen, ist möglicherweise nicht die "richtige" Abwärtsmigration.def self.up
unddef self.down
mitdef change
und es wird wissen , wie ein Rollback.change
Verfahren nicht die volle Beweis ist, so ist in der Regel verwendet werdenup
unddown
für komplexe Migrationen Methoden.Meiner Meinung nach ist es in diesem Fall besser
rake db:rollback
, die Migration zu verwenden , zu bearbeiten und erneut auszuführenrake db:migrate
.Wenn Sie jedoch Daten in der Spalte haben, die Sie nicht verlieren möchten, verwenden Sie
rename_column
.quelle
Wenn die Spalte bereits mit Daten gefüllt ist und sich in der Produktion befindet, würde ich einen schrittweisen Ansatz empfehlen, um Ausfallzeiten in der Produktion 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 aus dem alten Spaltennamen zu füllen.
Dann würde ich genau diese Änderung begehen und die Änderung in die Produktion bringen.
Sobald das Commit in die Produktion verschoben wurde, würde ich laufen.
Dann würde ich alle Ansichten / Controller aktualisieren, die den alten Spaltennamen auf den neuen Spaltennamen verweisen. Führen Sie meine Testsuite durch und übernehmen Sie nur diese Änderungen. (Nachdem Sie sichergestellt haben, dass es lokal funktioniert und alle Tests zuerst bestanden haben!)
Dann würde ich dieses Engagement für die Produktion vorantreiben.
Zu diesem Zeitpunkt können Sie die ursprüngliche Spalte entfernen, ohne sich Gedanken über Ausfallzeiten machen zu müssen, die mit der Migration selbst verbunden sind.
Schieben Sie dann diese neueste Migration in die Produktion und führen Sie 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 mit meiner Produktionsmigration zu haben.
quelle
execute "Update table_name set correct_name_column_one = old_name_column_one"
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.
quelle
rename_column
.Führen Sie den folgenden Befehl aus, um eine Migrationsdatei zu erstellen:
db/migrate
Schreiben Sie dann in die im Ordner generierte Dateirename_column
wie folgt:quelle
Von der API:
Es benennt eine Spalte um, behält jedoch den Typ und den Inhalt bei.
quelle
Einige Versionen von Ruby on Rails unterstützen die Up / Down-Methode für die Migration. Wenn Ihre Migration eine Up / Down-Methode enthält, gilt Folgendes:
Wenn Sie die
change
Methode in Ihrer Migration haben, dann:Weitere Informationen können Sie verschieben: Ruby on Rails - Migrationen oder Active Record-Migrationen .
quelle
Wenn Ihr Code nicht mit anderen geteilt wird, ist es am besten, wenn Sie
rake db:rollback
Ihren Spaltennamen in der Migration und bearbeitenrake db:migrate
. Das ist esSie können eine weitere Migration schreiben, um die Spalte umzubenennen
Das ist es.
quelle
rake db:rollback
ist ein toller Vorschlag. Aber wie Sie sagten, nur wenn die Migration noch nicht vorangetrieben wurde.Als alternative Option gibt es für ActiveRecord ein überzeugendes Juwel, das die Namensänderungen automatisch im Datamapper-Stil für Sie übernimmt, wenn Sie nicht mit der Idee von Migrationen verheiratet sind. Alles, was Sie tun, ist, den Spaltennamen in Ihrem Modell zu ändern (und sicherzustellen, 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: Sie müssen db / schema.rb nuken , um Konflikte zu vermeiden
Noch in der Beta-Phase und natürlich nicht für jedermann, aber immer noch eine überzeugende Wahl (ich verwende es derzeit in zwei nicht trivialen Produktions-Apps ohne Probleme).
quelle
Wenn Sie den Spaltennamen wechseln müssen, müssen Sie einen Platzhalter erstellen, um einen doppelten Spaltennamenfehler zu vermeiden . Hier ist ein Beispiel:
quelle
Wenn die vorliegenden Daten für Sie nicht wichtig sind, können Sie Ihre ursprüngliche Migration einfach mit folgenden Schritten beenden:
Nehmen Sie ohne die Anführungszeichen Änderungen an der ursprünglichen Migration vor und führen Sie die Aufwärtsmigration erneut aus durch:
quelle
Erstellen Sie einfach eine neue Migration und verwenden Sie sie in einem Block
rename_column
wie folgt.quelle
Für Ruby on Rails 4:
quelle
Manuell können wir die folgende Methode verwenden:
Wir können die Migration manuell bearbeiten wie folgt:
Öffnen
app/db/migrate/xxxxxxxxx_migration_file.rb
Update
hased_password
aufhashed_password
Führen Sie den folgenden Befehl aus
Dann wird Ihre Migration entfernt:
Es wird Ihre Migration mit der aktualisierten Änderung hinzufügen.
quelle
Generieren Sie die Migrationsdatei:
# Erstellt db / migrate / xxxxxxxxxx.rb
Bearbeiten Sie die Migration nach Ihren Wünschen.
quelle
Lauf
rails g migration ChangesNameInUsers
(oder wie auch immer Sie es nennen möchten)Öffnen Sie die soeben generierte Migrationsdatei und fügen Sie diese Zeile in die Methode ein (zwischen
def change
undend
):rename_column :table_name, :the_name_you_want_to_change, :the_new_name
Speichern Sie die Datei und führen Sie sie
rake db:migrate
in der Konsole ausÜberprüfen Sie Ihre
schema.db
, um festzustellen, ob sich der Name in der Datenbank tatsächlich geändert hat!Hoffe das hilft :)
quelle
Lass uns küssen . Alles was es braucht sind drei einfache Schritte. Das Folgende funktioniert für Rails 5.2 .
1. Erstellen Sie eine Migration
rails g migration RenameNameToFullNameInStudents
rails g RenameOldFieldToNewFieldInTableName
- Auf diese Weise ist es den Betreuern der Codebasis später völlig klar. (Verwenden Sie einen Plural für den Tabellennamen).2. Bearbeiten Sie die Migration
# I prefer to explicitly write the
raufand
runtermethods.
# ./db/migrate/20190114045137_rename_name_to_full_name_in_students.rb
3. Führen Sie Ihre Migrationen aus
rake db:migrate
Und du bist auf dem Weg zu den Rennen!
quelle
Öffnen Sie diese Migrationsdatei und ändern Sie diese Datei wie folgt (Geben Sie Ihr Original ein
table_name
)quelle
quelle
Generieren Sie eine Ruby on Rails-Migration :
Fügen Sie Code in die Migrationsdatei ein (XXXXXfixcolumnname.rb) :
quelle
Öffnen Sie Ihre Ruby on Rails-Konsole und geben Sie Folgendes ein:
quelle
Sie haben zwei Möglichkeiten, dies zu tun:
Bei diesem Typ wird beim Rollback automatisch der umgekehrte Code ausgeführt.
Bei diesem Typ wird die Aufwärtsmethode ausgeführt, wenn
rake db:migrate
und die Abwärtsmethode ausgeführt, wennrake db:rollback
:quelle
Ich bin auf Rails 5.2 und versuche, eine Spalte auf einem Entwicklerbenutzer umzubenennen.
Das
rename_column
Bit hat bei mir funktioniert, aber der Singular hat den:table_name
Fehler "Benutzertabelle nicht gefunden" ausgegeben. Plural hat für mich gearbeitet.Ändern Sie dann die Migrationsdatei in folgende Datei:
Wo: Agent? ist der alte Spaltenname.
quelle
Update - Ein enger Verwandter von create_table ist change_table, mit dem vorhandene Tabellen geändert werden. Es wird auf ähnliche Weise wie create_table verwendet, aber das dem Block übergebene Objekt kennt mehr Tricks. Zum Beispiel:
Diese Methode ist effizienter, wenn wir andere Änderungsmethoden verwenden, z. B.: Index entfernen / Index hinzufügen / Index entfernen / Spalte hinzufügen, z.
quelle
Generieren Sie einfach die Migration mit dem Befehl
Nach dieser Bearbeitung der Migration fügen Sie die folgende Zeile in der Änderungsmethode hinzu
Dies sollte den Trick tun.
quelle
Rails 5-Migrationsänderungen
z.B:
Wenn Sie die Spalte student_name als Namen ändern möchten
Hinweis: - Wenn Sie keine Rails ausführen db: migrate
Sie können die folgenden Schritte ausführen
Dadurch wird die generierte Migrationsdatei entfernt. Jetzt können Sie Ihren Spaltennamen korrigieren
Wenn Sie migriert haben (Rails DB: Migrieren), gehen Sie wie folgt vor, um den Spaltennamen zu ändern
quelle
rails g migration RemoveStudentNameFromStudentS student_name:string
(die Schüler sind Plural)?