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.

Nick Hammond
quelle
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
Prabu
quelle
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.

Befugnisse
quelle
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
Lars Schirrmeister
quelle
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

überleuchtet
quelle
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
aschmid
quelle
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 .

Imran Ahmad
quelle
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!

BKSpurgeon
quelle
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 .

Lorem Ipsum Dolor
quelle
11

Sie können Folgendes versuchen:

remove_column :table_name, :column_name

( Offizielle Dokumentation )

Jordan läuft
quelle
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.

Eden
quelle
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
Koresol
quelle
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
prash
quelle
5

remove_columnMit der changeMethode in können Sie die Spalte aus der Tabelle löschen.

class RemoveColumn < ActiveRecord::Migration
  def change
    remove_column :table_name, :column_name, :data_type
  end
end

Klicken Sie auf diesen Link, um eine vollständige Referenz zu erhalten: http://guides.rubyonrails.org/active_record_migrations.html

Dharmesh Rupani
quelle
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

Karan Bamniya
quelle
2

Hier ist noch einer von der Schienenkonsole

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

Tenzin Dorjee
quelle
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

Manh Cuong
quelle
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

Nuttapon
quelle
1

Sie können einfach die Spalte entfernen

remove_column :table_name, :column_name

Zum Beispiel,

remove_column :posts, :comment
Foram Thakral
quelle
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
Taha20
quelle