Come eliminare le colonne utilizzando la migrazione di Rails


Risposte:


917
remove_column :table_name, :column_name

Per esempio:

remove_column :users, :hobby

rimuoverebbe la colonna hobby dalla tabella degli utenti.


9
E assicurati di farlo all'interno upe nei downmetodi, non change, come spiegato nella risposta di @Powers.
XåpplI'-I0llwlg'I -

7
@ XåpplI'-I0llwlg'I-Grazie per il commento. Il metodo di modifica può essere utilizzato per eliminare una colonna nelle applicazioni Rails 4, ma non deve essere utilizzato in Rails 3. Ho aggiornato la mia risposta di conseguenza.
Poteri dal

9
È inoltre possibile utilizzare remove_column :table_name, :column_name, :type, :optionsall'interno del changemetodo, poiché se si specifica il tipo è possibile ripristinare la migrazione. Dalla documentazione: I parametri typee optionsverranno ignorati se presenti. Può essere utile fornire questi nel changemetodo di una migrazione in modo che possa essere ripristinato. In tal caso, typee optionsverrà utilizzato da add_column.
Nicolas,

24
In Rails4, puoi rimuovere una colonna nel changemetodo, ma solo se specifichi il tipo di colonna. Es remove_column, :table_name, :column_name, :column_type. In caso contrario, quando si tenta di eseguire la migrazione viene visualizzato il seguente errore:remove_column is only reversible if given a type
Dennis,

5
Vale la pena notare nella risposta principale che la rimozione di una colonna non rimuove l'indice corrispondente se esiste
stessi

371

Per le versioni precedenti di Rails

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

Per Rails 3 e versioni successive

rails generate migration RemoveFieldNameFromTableName field_name:datatype

18
"rails g" può essere usato in alternativa a "rails generate"
Noz,

44
rails g migration remove_field_name_from_table_name field_name:datatypefunziona anche
Stuart Nelson,

6
Si noti inoltre che AddXXXtoTTTun RemoveXXXFromTTTpuò essere seguito da un elenco a spaziatura bianca di filed_name: data_type e verranno create le istruzioni add_column e remove_column appropriate: rails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integerrimuove due attributi usando una singola migrazione. Si noti inoltre che remove_columnnon è supportato dal changemetodo, quindi è necessario scrivere sia upe down.
Claudio Floreani,

3
Rails 4 sembra supportare changequesto. Il rollback funziona come dovrebbe.
Unknown_Guy,

2
@AdamGrant Penso che se stai usando un changemetodo che può essere ripristinato * dovrai informare il tipo di dati (e tutti gli altri modificatori di campo), quindi se esegui il rollback di quella migrazione, il campo può essere ricreato correttamente. * Quando dico ripristinato, questo è in termini di struttura del database, ovviamente, i dati di quella colonna andranno ovviamente persi.
RFVoltolini,

117

Rails 4 è stato aggiornato, quindi il metodo di modifica può essere utilizzato nella migrazione per eliminare una colonna e la migrazione verrà ripristinata correttamente. Leggere il seguente avviso per le applicazioni Rails 3:

Avviso Rails 3

Si noti che quando si utilizza questo comando:

rails generate migration RemoveFieldNameFromTableName field_name:datatype

La migrazione generata sarà simile a questa:

  def up
    remove_column :table_name, :field_name
  end

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

Assicurati di non utilizzare il metodo di modifica quando rimuovi le colonne da una tabella del database (esempio di ciò che non vuoi nel file di migrazione nelle app Rails 3):

  def change
    remove_column :table_name, :field_name
  end

Il metodo di modifica in Rails 3 non è intelligente quando si tratta di remove_column, quindi non sarà possibile ripristinare questa migrazione.


3
quindi esegui rake db: migrate
roxdurazo il

1
@Powers - risposta brillante e chiara - saresti in grado di elaborare quanto segue: "Il metodo di modifica in Rails 3 non è intelligente quando si tratta di rimuovere_colonna, quindi non sarà possibile ripristinare questa migrazione."
BKSpurgeon,

1
@BKSpurgeon: in Rails 3, se si utilizza il changemetodo, il rake db:rollbackcomando verrà visualizzato in errore. rake db:rollbackè sostanzialmente l'opposto di rake db:migrate. Questo bug è stato corretto in Rails 4 :)
Poteri il

2
In Rails 4, ho provato a ripristinare una colonna di rilascio modifica. Non riesce e afferma che è necessario specificare data_type (come nel down code nella risposta)
rmcsharry

1
Lo stesso problema si è verificato a me di @rmcsharry. La mia versione di rails è la 4.2.2 e ho usato il metodo change. quando ho provato a eseguire il rollback, si è verificato un errore che remove_column è reversibile solo se viene fornito un tipo.
M. Habib,

38

In un'app rails4 è possibile utilizzare il metodo change anche per rimuovere colonne. Il terzo parametro è data_type e nel quarto opzionale è possibile fornire opzioni. È un po 'nascosto nella sezione "Trasformazioni disponibili" nella documentazione .

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

27

Ci sono due buoni modi per farlo:

remove_column

Puoi semplicemente usare remove_column, in questo modo:

remove_column :users, :first_name

Questo va bene se hai solo bisogno di apportare una singola modifica al tuo schema.

blocco change_table

Puoi anche farlo usando un blocco change_table, in questo modo:

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

Preferisco questo perché lo trovo più leggibile e puoi apportare diverse modifiche contemporaneamente.

Ecco l'elenco completo dei metodi change_table supportati:

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


15

nelle rotaie 5 è possibile utilizzare questo comando nel terminale:

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

ad esempio per rimuovere la colonna access_level (stringa) dagli utenti della tabella:

rails generate migration remove_access_level_from_users access_level:string

e quindi eseguire:

rake db:migrate

14

Generare una migrazione per rimuovere una colonna in modo tale che se viene migrata ( rake db:migrate), dovrebbe rilasciare la colonna . E dovrebbe aggiungere la colonna indietro se questa migrazione è rollbacked ( rake db:rollback).

La sintassi:

remove_column: table_name,: column_name,: type

Rimuove la colonna, inoltre aggiunge la colonna indietro se la migrazione viene ripristinata.

Esempio:

remove_column :users, :last_name, :string

Nota : se salti data_type , la migrazione rimuoverà correttamente la colonna ma se esegui il rollback della migrazione genererà un errore.


13

Istruzioni chiare e semplici per le rotaie 5.2

  • ATTENZIONE: perderai i dati se rimuovi una colonna dal tuo database . Per procedere, vedi sotto:
  • Attenzione: le istruzioni seguenti sono per migrazioni banali . Per migrazioni complesse con ad esempio milioni e milioni di righe, dovrai tenere conto della possibilità di errori, dovrai anche pensare a come ottimizzare le migrazioni in modo che vengano eseguite rapidamente e alla possibilità che gli utenti utilizzino la tua app mentre si sta verificando il processo di migrazione. Se disponi di più database o se qualcosa è remotamente complicato, non incolparmi se qualcosa va storto!

1. Creare una migrazione

Esegui il seguente comando nel tuo terminale:

rails generate migration remove_fieldname_from_tablename fieldname:fieldtype

Nota: il nome della tabella deve essere in forma plurale come da convenzione delle rotaie.

Esempio:

Nel mio caso voglio rimuovere la acceptedcolonna (un valore booleano) dalla quotestabella:

rails g migration RemoveAcceptedFromQuotes accepted:boolean

Vedi la documentazione relativa a : una convenzione durante l'aggiunta / rimozione di campi in una tabella:

Esiste uno speciale collegamento sintattico per generare migrazioni che aggiungono campi a una tabella.

le rotaie generano migrazione add_fieldname_to_tablename fieldname: fieldtype

2. Controlla la migrazione

# 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. Esegui la migrazione

rake db:migrate

.... E poi parti per le gare!


ora le migrazioni possono anche essere eseguite comerails db:migrate
Imran Ali l'

12

Rimuovi colonne per l'app RAILS 5

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

Il comando sopra genera un file di migrazione all'interno della db/migratedirectory. Lo snippet blow è uno dei rimuovi colonna dall'esempio di tabella generato dal generatore Rails,

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

Ho anche realizzato una rapida guida di riferimento per Rails che può essere trovata qui .



10
rails g migration RemoveXColumnFromY column_name:data_type

X = nome colonna
Y = nome tabella

MODIFICARE

Cambiato RemoveXColumnToYper RemoveXColumnFromYcome da commenti - consente una maggiore chiarezza per ciò che la migrazione è in realtà facendo.


3
"Rimuovi colonna in tabella" suona strano, quindi da sembra essere la scelta migliore qui.
Sebastian vom Meer,

@SebastianvomMeer sì, concordo - l'inglese legge molto meglio con 'from'
BKSpurgeon

8

Per rimuovere la colonna dalla tabella devi eseguire la seguente migrazione:

rails g migration remove_column_name_from_table_name column_name:data_type

Quindi eseguire il comando:

rake db:migrate

5

Dare sotto il comando che aggiungerà nel file di migrazione da solo

rails g migration RemoveColumnFromModel

Dopo aver eseguito il comando sopra puoi controllare il file di migrazione remove_column, il codice deve essere aggiunto lì da solo

Quindi migrare il db

rake db:migrate


5

Per rimuovere la colonna dalla tabella in soli 3 semplici passaggi, come segue:

  1. scrivi questo comando

rails g migration remove_column_from_table_name

dopo aver eseguito questo comando nel terminale un file creato con questo nome e timestamp (remove_column from_table_name).

Quindi vai a questo file.

  1. all'interno del file devi scrivere

    remove_column :table_name, :column_name

  2. Finalmente vai alla console e poi fallo

    rake db:migrate


2

Eccone un'altra dalla console delle rotaie

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


1

Attraverso
remove_column :table_name, :column_name
in un file di migrazione

È possibile rimuovere una colonna direttamente in una console di rotaie digitando:
ActiveRecord::Base.remove_column :table_name, :column_name


1

Fai così;

rails g migration RemoveColumnNameFromTables column_name:type

ie rails g migration RemoveTitleFromPosts title:string

In ogni caso, sarebbe meglio considerare i tempi di inattività e poiché ActiveRecord memorizza nella cache le colonne del database in fase di esecuzione, quindi se si elimina una colonna, potrebbero verificarsi eccezioni fino al riavvio dell'app.

Rif: forte migrazione


1

Semplicemente, puoi rimuovere la colonna

remove_column :table_name, :column_name

Per esempio,

remove_column :posts, :comment

1

prima prova a creare un file di migrazione eseguendo il comando:

rails g migration RemoveAgeFromUsers age:string

e quindi nella directory principale del progetto esegui la migrazione eseguendo il comando:

rails db:migrate
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.