So löschen Sie Spalten mithilfe der Rails-Migration


Antworten:


917
remove_column :table_name, :column_name

Zum Beispiel:

remove_column :users, :hobby

würde die Hobby-Spalte aus der Benutzertabelle entfernen.


9
Und stellen Sie sicher, dass Sie dies innerhalb upund außerhalb der downMethoden tun change, wie in der Antwort von @Powers erläutert.
XåpplI'-I0llwlg'I -

7
@ XåpplI'-I0llwlg'I-Danke für den Kommentar. Die Änderungsmethode kann zum Löschen einer Spalte in Rails 4-Anwendungen verwendet werden, sollte jedoch nicht in Rails 3 verwendet werden. Ich habe meine Antwort entsprechend aktualisiert.
Powers

9
Sie können auch remove_column :table_name, :column_name, :type, :optionsinnerhalb der changeMethode verwenden, da die Migration möglich ist, wenn Sie den Typ angeben, der zurückgesetzt werden soll. Aus der Dokumentation: Die typeund optionsParameter , falls vorhanden ignoriert. Es kann hilfreich sein, diese in der changeMethode einer Migration anzugeben, damit sie zurückgesetzt werden kann. In diesem Fall typeund optionswird von add_column verwendet.
Nicolas

24
In Rails4 können Sie eine Spalte in der changeMethode entfernen , jedoch nur, wenn Sie den Spaltentyp angeben. ZB remove_column, :table_name, :column_name, :column_type. Andernfalls wird beim Versuch, die Migration auszuführen, die folgende Fehlermeldung angezeigt:remove_column is only reversible if given a type
Dennis

5
Es könnte erwähnenswert sein, in der Hauptantwort zu erwähnen, dass das Entfernen einer Spalte den entsprechenden Index nicht entfernt, wenn er existiert
Sameers

371

Für ältere Versionen von Rails

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

Für Schienen 3 und höher

rails generate migration RemoveFieldNameFromTableName field_name:datatype

18
"Rails g" kann als Alternative zu "Rails Generate" verwendet werden
Noz

44
rails g migration remove_field_name_from_table_name field_name:datatypefunktioniert auch
Stuart Nelson

6
Beachten Sie auch, dass auf AddXXXtoTTTeine RemoveXXXFromTTTListe mit weißem Abstand von Dateiname: Datentyp folgen kann und die entsprechenden Anweisungen add_column und remove_column erstellt werden: Entfernt rails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integerzwei Attribute mithilfe einer einzelnen Migration. Beachten Sie auch , dass remove_columnnicht unterstützt von changeVerfahren, so dass Sie beide schreiben müssen upund down.
Claudio Floreani

3
Rails 4 scheint dies zu unterstützen change. Rollback funktioniert wie es sollte.
Unknown_Guy

2
@AdamGrant Ich denke, wenn Sie eine changeMethode verwenden, die zurückgesetzt werden kann *, müssen Sie den Datentyp (und alle anderen Feldmodifikatoren) angeben. Wenn Sie diese Migration zurücksetzen, kann das Feld korrekt neu erstellt werden. * Wenn ich "Zurückgesetzt" sage, bedeutet dies natürlich, dass Daten aus dieser Spalte verloren gehen.
RFVoltolini

117

Rails 4 wurde aktualisiert, sodass die Änderungsmethode bei der Migration zum Löschen einer Spalte verwendet werden kann und die Migration erfolgreich zurückgesetzt wird. Bitte lesen Sie die folgende Warnung für Rails 3-Anwendungen:

Schienen 3 Warnung

Bitte beachten Sie Folgendes, wenn Sie diesen Befehl verwenden:

rails generate migration RemoveFieldNameFromTableName field_name:datatype

Die generierte Migration sieht ungefähr so ​​aus:

  def up
    remove_column :table_name, :field_name
  end

  def down
    add_column :table_name, :field_name, :datatype
  end

Stellen Sie sicher, dass Sie die Änderungsmethode nicht verwenden, wenn Sie Spalten aus einer Datenbanktabelle entfernen (Beispiel für das, was Sie in der Migrationsdatei in Rails 3-Apps nicht möchten):

  def change
    remove_column :table_name, :field_name
  end

Die Änderungsmethode in Rails 3 ist nicht klug, wenn es um remove_column geht, sodass Sie diese Migration nicht rückgängig machen können.


3
Führen Sie dann Rake
DB aus

1
@Powers - eine brillante und klare Antwort - könnten Sie Folgendes näher erläutern: "Die Änderungsmethode in Rails 3 ist nicht klug, wenn es um remove_column geht, sodass Sie diese Migration nicht rückgängig machen können."
BKSpurgeon

1
@BKSpurgeon - Wenn Sie in Rails 3 die changeMethode verwenden, wird der rake db:rollbackBefehl fehlerhaft ausgegeben . rake db:rollbackist im Grunde das Gegenteil von rake db:migrate. Dieser Fehler wurde in Rails 4 behoben :)
Powers

2
In Rails 4 habe ich versucht, eine Änderungs-Drop-Spalte zurückzusetzen. Es schlägt fehl und besagt, dass Sie data_type angeben müssen (wie in Ihrem Downcode in Ihrer Antwort)
rmcsharry

1
Mir ist das gleiche Problem aufgetreten wie bei @rmcsharry. Meine Rails-Version ist 4.2.2 und ich habe die Änderungsmethode verwendet. Als ich versuchte, ein Rollback durchzuführen, trat der Fehler auf, dass remove_column nur umkehrbar ist, wenn ein Typ angegeben wird.
M. Habib

38

In einer Rails4-App ist es möglich, die Änderungsmethode auch zum Entfernen von Spalten zu verwenden. Der dritte Parameter ist der Datentyp und im optionalen vierten können Sie Optionen angeben. Es ist etwas versteckt im Abschnitt 'Verfügbare Transformationen' in der Dokumentation .

class RemoveFieldFromTableName < ActiveRecord::Migration
  def change
    remove_column :table_name, :field_name, :data_type, {}
  end
end

27

Es gibt zwei gute Möglichkeiten, dies zu tun:

remove_column

Sie können remove_column einfach wie folgt verwenden:

remove_column :users, :first_name

Dies ist in Ordnung, wenn Sie nur eine einzige Änderung an Ihrem Schema vornehmen müssen.

change_table-Block

Sie können dies auch mit einem change_table-Block tun, wie folgt:

change_table :users do |t|
  t.remove :first_name
end

Ich bevorzuge dies, da ich es besser lesbar finde und Sie mehrere Änderungen gleichzeitig vornehmen können.

Hier ist die vollständige Liste der unterstützten change_table-Methoden:

http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table


15

In Rails 5 können Sie diesen Befehl im Terminal verwenden:

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

So entfernen Sie beispielsweise die Spalte access_level (Zeichenfolge) von Tabellenbenutzern:

rails generate migration remove_access_level_from_users access_level:string

und dann ausführen:

rake db:migrate

14

Generieren Sie eine Migration, um eine Spalte so zu entfernen, dass sie bei einer Migration ( rake db:migrate) die Spalte löschen sollte . Und es sollte eine Spalte zurück hinzufügen, wenn diese Migration zurückgesetzt wird ( rake db:rollback).

Die Syntax:

remove_column: table_name ,: column_name ,: type

Entfernt die Spalte und fügt die Spalte zurück, wenn die Migration zurückgesetzt wird.

Beispiel:

remove_column :users, :last_name, :string

Hinweis : Wenn Sie den Datentyp überspringen , wird die Spalte bei der Migration erfolgreich entfernt. Wenn Sie die Migration jedoch zurücksetzen , wird ein Fehler ausgegeben .


13

Klare und einfache Anweisungen für Schienen 5.2

  • WARNUNG: Sie verlieren Daten, wenn Sie eine Spalte aus Ihrer Datenbank entfernen . Um fortzufahren, siehe unten:
  • Warnung: Die folgenden Anweisungen gelten für einfache Migrationen . Bei komplexen Migrationen mit z. B. Millionen und Abermillionen von Zeilen müssen Sie die Möglichkeit von Fehlern berücksichtigen, darüber nachdenken, wie Sie Ihre Migrationen so optimieren können, dass sie schnell ausgeführt werden, und die Möglichkeit, dass Benutzer Ihre App währenddessen verwenden Der Migrationsprozess findet statt. Wenn Sie mehrere Datenbanken haben oder wenn etwas aus der Ferne kompliziert ist, dann beschuldigen Sie mich nicht, wenn etwas schief geht!

1. Erstellen Sie eine Migration

Führen Sie den folgenden Befehl in Ihrem Terminal aus:

rails generate migration remove_fieldname_from_tablename fieldname:fieldtype

Hinweis: Der Tabellenname sollte gemäß der Schienenkonvention im Plural vorliegen.

Beispiel:

In meinem Fall möchte ich die acceptedSpalte (einen booleschen Wert) aus der quotesTabelle entfernen :

rails g migration RemoveAcceptedFromQuotes accepted:boolean

Weitere Informationen zum Hinzufügen / Entfernen von Feldern zu einer Tabelle finden Sie in der Dokumentation zu : einer Konvention:

Es gibt eine spezielle syntaktische Verknüpfung zum Generieren von Migrationen, mit denen Felder zu einer Tabelle hinzugefügt werden.

Rails generieren Migration add_fieldname_to_tablename fieldname: fieldtype

2. Überprüfen Sie die Migration

# db/migrate/20190122035000_remove_accepted_from_quotes.rb
class RemoveAcceptedFromQuotes < ActiveRecord::Migration[5.2]
  # with rails 5.2 you don't need to add a separate "up" and "down" method.
  def change
    remove_column :quotes, :accepted, :boolean
  end
end

3. Führen Sie die Migration aus

rake db:migrate

.... und dann geht es los zu den Rennen!


Jetzt können Migrationen auch ausgeführt werden alsrails db:migrate
Imran Ali

12

Spalten für RAILS 5 App entfernen

rails g migration Remove<Anything>From<TableName> [columnName:type]

Der obige Befehl generiert eine Migrationsdatei im db/migrateVerzeichnis. Snippet Blow ist eine der Spalten aus dem Tabellenbeispiel entfernen, die vom Rails-Generator generiert wurden.

class RemoveAgeFromUsers < ActiveRecord::Migration
  def up
    remove_column :users, :age
  end
  def down
    add_column :users, :age, :integer
  end
end

Ich habe auch eine Kurzanleitung für Rails erstellt, die hier zu finden ist .



10
rails g migration RemoveXColumnFromY column_name:data_type

X = Spaltenname
Y = Tabellenname

BEARBEITEN

Geändert RemoveXColumnToYzu RemoveXColumnFromYgemäß Kommentar - bietet mehr Klarheit darüber, was die Migration tatsächlich tut.


3
„Spalte Entfernen zu Tisch“ klingt seltsam, so aus scheint hier die bessere Wahl zu sein.
Sebastian vom Meer

@SebastianvomMeer ja ich stimme zu - das Englisch liest viel besser mit 'von'
BKSpurgeon

8

Um die Spalte aus der Tabelle zu entfernen, müssen Sie folgende Migration ausführen:

rails g migration remove_column_name_from_table_name column_name:data_type

Führen Sie dann den folgenden Befehl aus:

rake db:migrate

5

Geben Sie den folgenden Befehl ein, der in der Migrationsdatei selbst hinzugefügt wird

rails g migration RemoveColumnFromModel

Nachdem Sie den obigen Befehl ausgeführt haben, können Sie überprüfen, ob die Migrationsdatei remove_column Code dort selbst hinzugefügt werden muss

Migrieren Sie dann die Datenbank

rake db:migrate


5

Zum Entfernen der Spalte aus der Tabelle in nur 3 einfachen Schritten wie folgt:

  1. Schreiben Sie diesen Befehl

rails g migration remove_column_from_table_name

Nach dem Ausführen dieses Befehls in Terminal wird eine Datei erstellt, die mit diesem Namen und Zeitstempel erstellt wurde (remove_column from_table_name).

Dann gehen Sie zu dieser Datei.

  1. Innerhalb der Datei müssen Sie schreiben

    remove_column :table_name, :column_name

  2. Zum Schluss zur Konsole gehen und dann tun

    rake db:migrate


2

Hier ist noch einer von der Schienenkonsole

ActiveRecord::Migration.remove_column(:table_name, :column_name)


1

Durch
remove_column :table_name, :column_name
in einer Migrationsdatei

Sie können eine Spalte direkt in einer Rails-Konsole entfernen, indem Sie Folgendes eingeben:
ActiveRecord::Base.remove_column :table_name, :column_name


1

Mach das so;

rails g migration RemoveColumnNameFromTables column_name:type

Dh rails g migration RemoveTitleFromPosts title:string

Auf jeden Fall sollten Sie auch Ausfallzeiten berücksichtigen, da ActiveRecord zur Laufzeit Datenbankspalten zwischenspeichert. Wenn Sie also eine Spalte löschen, kann dies zu Ausnahmen führen, bis Ihre App neu gestartet wird.

Ref: Starke Migration


1

Sie können einfach die Spalte entfernen

remove_column :table_name, :column_name

Zum Beispiel,

remove_column :posts, :comment

1

Versuchen Sie zunächst, eine Migrationsdatei zu erstellen, in der der Befehl ausgeführt wird:

rails g migration RemoveAgeFromUsers age:string

Führen Sie dann im Stammverzeichnis des Projekts die Migration aus, indem Sie den folgenden Befehl ausführen:

rails db:migrate
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.