Jak upuszczać kolumny za pomocą migracji Railsów

Odpowiedzi:

917
remove_column :table_name, :column_name

Na przykład:

remove_column :users, :hobby

usunąłby kolumnę hobby z tabeli użytkowników.

Nick Hammond
źródło
9
I upewnij się, że robisz to w środku upi downmetodami, a nie change, jak wyjaśniono w odpowiedzi @Powers.
XåpplI'-I0llwlg'I -
7
@ XåpplI'-I0llwlg'I-Dzięki za komentarz. Metodę zmiany można użyć do upuszczenia kolumny w aplikacjach Rails 4, ale nie należy jej używać w Rails 3. Odpowiednio zaktualizowałem swoją odpowiedź.
Powers
9
Możesz również użyć remove_column :table_name, :column_name, :type, :optionstej changemetody, ponieważ jeśli określisz typ, możliwe jest przywrócenie migracji. Z dokumentacji: i parametry będą ignorowane, jeśli obecne. Pomocne może być podanie ich w metodzie migracji, aby można ją było przywrócić. W takim przypadku i będzie używany przez add_column. typeoptionschangetypeoptions
Nicolas
24
W Rails4 możesz usunąć kolumnę w changemetodzie, ale tylko jeśli określisz typ kolumny. Np remove_column, :table_name, :column_name, :column_type. W przeciwnym razie podczas próby uruchomienia migracji remove_column is only reversible if given a type
Dennis
5
Warto zauważyć w głównej odpowiedzi, że usunięcie kolumny nie powoduje usunięcia odpowiedniego indeksu, jeśli istnieje
podobnie
371

Dla starszych wersji Railsów

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

Dla Rails 3 i nowszych

rails generate migration RemoveFieldNameFromTableName field_name:datatype
prabu
źródło
18
„szyny g” mogą być używane jako alternatywa dla „generowania szyn”
Noz
44
rails g migration remove_field_name_from_table_name field_name:datatypedziała również
Stuart Nelson
6
Zauważ też, że po AddXXXtoTTTznaku RemoveXXXFromTTTmoże znajdować się biała lista nazwa_pliku: typ_danych, i zostaną utworzone odpowiednie instrukcje add_column i remove_column: rails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integerusuwa dwa atrybuty za pomocą pojedynczej migracji. Zauważ też, że remove_columnnie jest obsługiwany przez changemetodę, więc musisz napisać zarówno, jak upi down.
Claudio Floreani
3
Rails 4 wydaje się to wspierać change. Wycofanie działa tak, jak powinno.
Unknown_Guy
2
@AdamGrant Myślę, że jeśli używasz changemetody, którą można przywrócić * , musisz poinformować o typie danych (i wszystkich innych modyfikatorach pola), więc jeśli cofniesz tę migrację, pole można poprawnie odtworzyć. * Kiedy mówię „cofnięty”, chodzi o strukturę bazy danych, oczywiście dane z tej kolumny oczywiście zostaną utracone.
RFVoltolini
117

Rails 4 został zaktualizowany, więc można użyć metody zmiany w migracji, aby usunąć kolumnę, a migracja zostanie pomyślnie wycofana. Przeczytaj następujące ostrzeżenie dla aplikacji Rails 3:

Ostrzeżenie o szynach 3

Pamiętaj, że podczas korzystania z tego polecenia:

rails generate migration RemoveFieldNameFromTableName field_name:datatype

Wygenerowana migracja będzie wyglądać mniej więcej tak:

  def up
    remove_column :table_name, :field_name
  end

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

Pamiętaj, aby nie używać metody zmiany podczas usuwania kolumn z tabeli bazy danych (przykład tego, czego nie chcesz w pliku migracji w aplikacjach Rails 3):

  def change
    remove_column :table_name, :field_name
  end

Metoda zmiany w Rails 3 nie jest mądra, jeśli chodzi o remove_column, więc nie będzie można przywrócić tej migracji.

Uprawnienie
źródło
3
następnie uruchom rake db: migrate
roxdurazo
1
@Powers - genialna i jasna odpowiedź - czy byłbyś w stanie wyjaśnić następujące kwestie: „Metoda zmiany w Rails 3 nie jest mądra, jeśli chodzi o remove_column, więc nie będziesz w stanie przywrócić tej migracji”.
BKSpurgeon
1
@BKSpurgeon - W Rails 3, jeśli użyjesz tej changemetody, rake db:rollbackpolecenie się nie powiedzie. rake db:rollbackjest w zasadzie przeciwieństwem rake db:migrate. Ten błąd został naprawiony w Rails 4 :)
Powers
2
W Railsach 4 próbowałem wycofać kolumnę upuszczania zmian. Błąd kończy się niepowodzeniem i stwierdza, że ​​należy podać typ danych (jak w kodzie w dół w odpowiedzi)
rmcsharry
1
Wystąpił dla mnie taki sam problem jak w przypadku @rmcsharry. Moja wersja szyn to 4.2.2 i użyłem metody zmiany. kiedy próbowałem wycofać, wystąpił błąd, że remove_column jest odwracalny tylko wtedy, gdy jest podany typ.
M. Habib,
38

W aplikacji rails4 można użyć metody zmiany również do usuwania kolumn. Trzecim parametrem jest data_type, aw opcjonalnym czwartym możesz podać opcje. Jest to nieco ukryte w sekcji „Dostępne transformacje” w dokumentacji .

class RemoveFieldFromTableName < ActiveRecord::Migration
  def change
    remove_column :table_name, :field_name, :data_type, {}
  end
end
Lars Schirrmeister
źródło
27

Istnieją dwa dobre sposoby na to:

remove_column

Możesz po prostu użyć remove_column, tak jak:

remove_column :users, :first_name

Jest to w porządku, jeśli potrzebujesz tylko jednej zmiany w schemacie.

blok_tabeli zmian

Możesz to również zrobić za pomocą bloku change_table:

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

Wolę to, ponieważ uważam to za bardziej czytelne i możesz wprowadzić kilka zmian jednocześnie.

Oto pełna lista obsługiwanych metod change_table:

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

superluminarny
źródło
15

w szynach 5 możesz użyć tego polecenia w terminalu:

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

na przykład, aby usunąć kolumnę access_level (string) od użytkowników tabeli:

rails generate migration remove_access_level_from_users access_level:string

a następnie uruchom:

rake db:migrate
aschmid
źródło
14

Wygeneruj migrację, aby usunąć kolumnę, tak że jeśli jest migrowana ( rake db:migrate), powinna upuścić kolumnę . I powinien dodać kolumnę z powrotem, jeśli migracja zostanie wycofana (rake db:rollback ).

Składnia:

remove_column: nazwa_tabeli,: nazwa_kolumny,: typ

Usuwa kolumnę, a także dodaje kolumnę z powrotem, jeśli migracja zostanie wycofana .

Przykład:

remove_column :users, :last_name, :string

Uwaga : Jeśli pominiesz typ danych , migracja usunie kolumnę pomyślnie, ale jeśli cofniesz migrację, wygeneruje błąd.

Imran Ahmad
źródło
13

Jasne i proste instrukcje dotyczące szyn 5.2

  • OSTRZEŻENIE: Utracisz dane, jeśli usuniesz kolumnę ze swojej bazy danych . Aby kontynuować, patrz poniżej:
  • Ostrzeżenie: poniższe instrukcje dotyczą trywialnych migracji . W przypadku złożonych migracji obejmujących np. Miliony i miliony wierszy będziesz musiał wziąć pod uwagę możliwość awarii, musisz także pomyśleć o tym, jak zoptymalizować migracje, aby działały szybko, a także, że użytkownicy będą mogli korzystać z Twojej aplikacji podczas trwa proces migracji. Jeśli masz wiele baz danych lub jeśli coś jest zdalnie skomplikowane, nie obwiniaj mnie, jeśli coś pójdzie nie tak!

1. Utwórz migrację

Uruchom następujące polecenie w swoim terminalu:

rails generate migration remove_fieldname_from_tablename fieldname:fieldtype

Uwaga: nazwa tabeli powinna być w liczbie mnogiej zgodnie z konwencją o szynach.

Przykład:

W moim przypadku chcę usunąć acceptedkolumnę (wartość logiczną) z quotestabeli:

rails g migration RemoveAcceptedFromQuotes accepted:boolean

Zobacz dokumentację dotyczącą konwencji: podczas dodawania / usuwania pól do tabeli:

Istnieje specjalny skrót składniowy do generowania migracji, które dodają pola do tabeli.

szyny generują migrację add_fieldname_to_tablename nazwa_pola: typ pola

2. Sprawdź migrację

# 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. Uruchom migrację

rake db:migrate

.... A potem startujesz w wyścigach!

BKSpurgeon
źródło
teraz migracje można również uruchamiać jakorails db:migrate
Imran Ali
12

Usuń kolumny aplikacji RAILS 5

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

Polecenie powyżej generuje plik migracji w db/migratekatalogu. Snippet blow to jeden z przykładów usuwania kolumny z tabeli wygenerowanej przez generator Railsów,

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

Stworzyłem również krótki przewodnik po Railsach, który można znaleźć tutaj .

Lorem Ipsum Dolor
źródło
11

Możesz spróbować:

remove_column :table_name, :column_name

( Oficjalna dokumentacja )

Jordan Running
źródło
10
rails g migration RemoveXColumnFromY column_name:data_type

X = nazwa kolumny
Y = nazwa tabeli

EDYTOWAĆ

Zmieniono RemoveXColumnToYna RemoveXColumnFromYzgodnie z komentarzami - zapewnia większą przejrzystość tego, co faktycznie robi migracja.

eden
źródło
3
„Usuń kolumnę do tabeli” brzmi dziwnie, tak ze wydaje się być lepszym wyborem tutaj.
Sebastian vom Meer
@SebastianvomMeer tak zgadzam się - język angielski czyta znacznie lepiej z „from”
BKSpurgeon
8

Aby usunąć kolumnę z tabeli, musisz uruchomić następującą migrację:

rails g migration remove_column_name_from_table_name column_name:data_type

Następnie uruchom polecenie:

rake db:migrate
Koresol
źródło
5

Podaj poniższe polecenie, które doda we własnym pliku migracji

rails g migration RemoveColumnFromModel

Po uruchomieniu powyższej komendy możesz sprawdzić, czy plik migracyjny musi zostać usunięty

Następnie migruj bazę danych

rake db:migrate
prash
źródło
5

remove_columnw changemetodzie pomoże Ci usunąć kolumnę z tabeli.

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

Kliknij ten link, aby uzyskać pełne odniesienie: http://guides.rubyonrails.org/active_record_migrations.html

Dharmesh Rupani
źródło
5

Aby usunąć kolumnę z tabeli w 3 prostych krokach:

  1. napisz to polecenie

rails g migration remove_column_from_table_name

po uruchomieniu tej komendy w terminalu jeden plik utworzony przez tę nazwę i sygnaturę czasową (usuń kolumnę z nazwy_tabeli).

Następnie przejdź do tego pliku.

  1. wewnątrz pliku musisz napisać

    remove_column :table_name, :column_name

  2. Na koniec przejdź do konsoli, a następnie zrób

    rake db:migrate

Karan Bamniya
źródło
2

Jeszcze jedno z konsoli szyn

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

tenzin dorjee
źródło
1

W
remove_column :table_name, :column_name
pliku migracji

Możesz usunąć kolumnę bezpośrednio w konsoli szyn, wpisując:
ActiveRecord::Base.remove_column :table_name, :column_name

Manh Cuong
źródło
1

Rób jak to;

rails g migration RemoveColumnNameFromTables column_name:type

To znaczy rails g migration RemoveTitleFromPosts title:string

W każdym razie lepiej byłoby rozważyć także czas przestoju, ponieważ ActiveRecord buforuje kolumny bazy danych w czasie wykonywania, więc jeśli upuścisz kolumnę, może to powodować wyjątki do momentu ponownego uruchomienia aplikacji.

Ref: Silna migracja

Nuttapon
źródło
1

Po prostu możesz usunąć kolumnę

remove_column :table_name, :column_name

Na przykład,

remove_column :posts, :comment
Foram Thakral
źródło
1

najpierw spróbuj utworzyć plik migracji, uruchamiając polecenie:

rails g migration RemoveAgeFromUsers age:string

a następnie w katalogu głównym projektu uruchom migrację, uruchamiając polecenie:

rails db:migrate
Taha20
źródło