Como descartar colunas usando a migração do Rails

Respostas:

917
remove_column :table_name, :column_name

Por exemplo:

remove_column :users, :hobby

removeria a coluna hobby da tabela de usuários.

Nick Hammond
fonte
9
E certifique-se de fazer isso por dentro upe por downmétodos, não change, conforme explicado na resposta do @Powers.
XåpplI'-I0llwlg'I -
7
@ XåpplI'-I0llwlg'I-Obrigado pelo comentário. O método change pode ser usado para descartar uma coluna nos aplicativos Rails 4, mas não deve ser usado no Rails 3. Atualizei minha resposta de acordo.
Poderes
9
Você também pode usar remove_column :table_name, :column_name, :type, :optionsdentro do changemétodo, pois se você especificar o tipo de reversão da migração, é possível. Da documentação: Os parâmetros typee optionsserão ignorados se presentes. Pode ser útil fornecê-los no changemétodo de uma migração para que possa ser revertido. Nesse caso, typee optionsserá usado por add_column.
Nicolas
24
No Rails4, você pode remover uma coluna no changemétodo, mas somente se você especificar o tipo de coluna. Por exemplo remove_column, :table_name, :column_name, :column_type. Caso contrário, você receberá o seguinte erro ao tentar executar a migração:remove_column is only reversible if given a type
Dennis
5
Talvez valha a pena notar na resposta principal que remover uma coluna não remove o índice correspondente, se existir
Sameers
371

Para versões mais antigas do Rails

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

Para Rails 3 e superiores

rails generate migration RemoveFieldNameFromTableName field_name:datatype
prabu
fonte
18
"rails g" pode ser usado como uma alternativa à "carris gerar"
Noz
44
rails g migration remove_field_name_from_table_name field_name:datatypetambém funciona
Stuart Nelson
6
Observe também que AddXXXtoTTTum RemoveXXXFromTTTpode ser seguido por uma lista com espaçamento em branco de filename_name: data_type, e as instruções add_column e remove_column apropriadas serão criadas: rails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integerremove dois atributos usando uma única migração. Observe também que isso remove_columnnão é suportado pelo changemétodo, então você deve escrever ambos upe down.
Claudio Floreani
3
O Rails 4 parece apoiar changeisso. A reversão funciona como deveria.
precisa saber é o seguinte
2
@AdamGrant Acho que, se você estiver usando um changemétodo que pode ser revertido *, precisará informar o tipo de dados (e todos os outros modificadores de campo); portanto, se você reverter essa migração, o campo poderá ser recriado corretamente. * Quando digo revertido, isso é em termos de estrutura do banco de dados, é claro que os dados dessa coluna obviamente serão perdidos.
RFVoltolini
117

O Rails 4 foi atualizado, portanto, o método de alteração pode ser usado na migração para descartar uma coluna e a migração será revertida com êxito. Leia o seguinte aviso para aplicativos Rails 3:

Aviso do Rails 3

Observe que quando você usa este comando:

rails generate migration RemoveFieldNameFromTableName field_name:datatype

A migração gerada será mais ou menos assim:

  def up
    remove_column :table_name, :field_name
  end

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

Certifique-se de não usar o método change ao remover colunas de uma tabela de banco de dados (exemplo do que você não deseja no arquivo de migração nos aplicativos Rails 3):

  def change
    remove_column :table_name, :field_name
  end

O método de mudança no Rails 3 não é inteligente quando se trata de remove_column; portanto, você não poderá reverter essa migração.

Poderes
fonte
3
em seguida, execute rake db: migrate
roxdurazo 25/11
1
@Powers - resposta brilhante e clara - você seria capaz de elaborar o seguinte: "O método de alteração no Rails 3 não é inteligente quando se trata de remove_column; portanto, você não poderá reverter essa migração."
BKSpurgeon
1
@BKSpurgeon - No Rails 3, se você usar o changemétodo, o rake db:rollbackcomando cometerá um erro. rake db:rollbacké basicamente o oposto de rake db:migrate. Este bug foi corrigido no Rails 4 :)
Powers
2
No Rails 4, tentei reverter uma coluna de drop drop. Ele falhar e afirma que você deve especificar data_type (como em seu código para baixo em sua resposta)
rmcsharry
1
O mesmo problema me ocorreu quanto ao @rmcsharry. Minha versão do rails é 4.2.2 e usei o método change. Quando tentei reverter, ocorreu um erro que remove_column só é reversível se for fornecido um tipo.
Habib M.
38

Em um aplicativo rails4, é possível usar o método de alteração também para remover colunas. O terceiro parâmetro é o data_type e no opcional você pode dar opções. Está um pouco oculto na seção 'Transformações disponíveis' na documentação .

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

Existem duas boas maneiras de fazer isso:

remove_column

Você pode simplesmente usar remove_column, assim:

remove_column :users, :first_name

Isso é bom se você precisar fazer apenas uma alteração no seu esquema.

bloco change_table

Você também pode fazer isso usando um bloco change_table, assim:

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

Eu prefiro isso porque acho mais legível e você pode fazer várias alterações ao mesmo tempo.

Aqui está a lista completa dos métodos suportados change_table:

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

superluminário
fonte
15

nos trilhos 5 você pode usar este comando no terminal:

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

por exemplo, para remover a coluna access_level (string) dos usuários da tabela:

rails generate migration remove_access_level_from_users access_level:string

e então execute:

rake db:migrate
aschmid
fonte
14

Gere uma migração para remover uma coluna, de modo que, se for migrada ( rake db:migrate), ela deve soltar a coluna . E deve adicionar a coluna novamente se essa migração for revertida ( rake db:rollback).

A sintaxe:

remove_column: table_name,: column_name,: type

Remove a coluna, também adiciona a coluna de volta se a migração for revertida.

Exemplo:

remove_column :users, :last_name, :string

Nota : Se você pular o data_type , a migração removerá a coluna com êxito, mas se você reverter a migração, ocorrerá um erro.

Imran Ahmad
fonte
13

Instruções claras e simples para o Rails 5.2

  • AVISO: você perderá dados se remover uma coluna do banco de dados . Para continuar, veja abaixo:
  • Aviso: as instruções abaixo são para migrações triviais . Para migrações complexas com, por exemplo, milhões e milhões de linhas, você deverá considerar a possibilidade de falhas, além de pensar em como otimizar suas migrações para que elas sejam executadas rapidamente e a possibilidade de os usuários usarem seu aplicativo enquanto o processo de migração está ocorrendo. Se você possui vários bancos de dados ou se algo é remotamente complicado, não me culpe se algo der errado!

1. Crie uma migração

Execute o seguinte comando no seu terminal:

rails generate migration remove_fieldname_from_tablename fieldname:fieldtype

Nota: o nome da tabela deve estar no plural, conforme a convenção de trilhos.

Exemplo:

No meu caso, quero remover a acceptedcoluna (um valor booleano) da quotestabela:

rails g migration RemoveAcceptedFromQuotes accepted:boolean

Consulte a documentação re: uma convenção ao adicionar / remover campos em uma tabela:

Há um atalho sintático especial para gerar migrações que adicionam campos a uma tabela.

trilhos geram migração add_fieldname_to_tablename fieldname: fieldtype

2. Verifique a migração

# 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. Execute a migração

rake db:migrate

.... E então você está fora para as corridas!

BKSpurgeon
fonte
agora as migrações também podem ser executadas comorails db:migrate
Imran Ali
12

Remover colunas para o aplicativo RAILS 5

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

O comando acima gera um arquivo de migração dentro do db/migratediretório. O sopro do snippet é um dos da coluna remover do exemplo da tabela gerado pelo gerador Rails,

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

Também fiz um guia de referência rápida para o Rails, que pode ser encontrado aqui .

Lorem Ipsum Dolor
fonte
11

Você pode tentar o seguinte:

remove_column :table_name, :column_name

( Documentação oficial )

Jordan Running
fonte
10
rails g migration RemoveXColumnFromY column_name:data_type

X = nome da coluna
Y = nome da tabela

EDITAR

Mudou RemoveXColumnToYpara RemoveXColumnFromYcomo por comentários - fornece mais clareza para o que a migração está realmente fazendo.

Éden
fonte
3
"Remover a coluna para a tabela" soa estranho, por isso a partir parece ser a melhor escolha aqui.
Sebastian vom Meer
@SebastianvomMeer sim, eu concordo - o inglês lê muito melhor com 'from'
BKSpurgeon
8

Para remover a coluna da tabela, você deve executar a seguinte migração:

rails g migration remove_column_name_from_table_name column_name:data_type

Em seguida, execute o comando:

rake db:migrate
Koresol
fonte
5

Dê o comando abaixo, ele adicionará o arquivo de migração por conta própria

rails g migration RemoveColumnFromModel

Depois de executar o comando acima, você pode verificar o arquivo de migração, o código remove_column deve ser adicionado lá sozinho

Em seguida, migre o banco de dados

rake db:migrate
prash
fonte
5

remove_columnno changemétodo ajudará você a excluir a coluna da tabela.

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

Acesse este link para uma referência completa: http://guides.rubyonrails.org/active_record_migrations.html

Dharmesh Rupani
fonte
5

Para remover a coluna da tabela em apenas três etapas fáceis, como segue:

  1. escreva este comando

rails g migration remove_column_from_table_name

depois de executar este comando no terminal, um arquivo criado por esse nome e carimbo de data / hora (remove_column from_table_name).

Então vá para este arquivo.

  1. arquivo interno você tem que escrever

    remove_column :table_name, :column_name

  2. Por fim, vá ao console e faça

    rake db:migrate

Karan Bamniya
fonte
2

Aqui está mais um do console de trilhos

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

tenzin dorjee
fonte
1

Através
remove_column :table_name, :column_name
de um arquivo de migração

Você pode remover uma coluna diretamente em um console do Rails digitando:
ActiveRecord::Base.remove_column :table_name, :column_name

Manh Cuong
fonte
1

Faça assim;

rails g migration RemoveColumnNameFromTables column_name:type

Ou seja, rails g migration RemoveTitleFromPosts title:string

De qualquer forma, seria melhor considerar também o tempo de inatividade, pois o ActiveRecord armazena em cache as colunas do banco de dados em tempo de execução. Se você soltar uma coluna, isso poderá causar exceções até que o aplicativo seja reiniciado.

Ref: forte migração

Nuttapon
fonte
1

Simplesmente, você pode remover a coluna

remove_column :table_name, :column_name

Por exemplo,

remove_column :posts, :comment
Foram Thakral
fonte
1

primeiro tente criar um arquivo de migração executando o comando:

rails g migration RemoveAgeFromUsers age:string

e, no diretório raiz do projeto, execute a migração executando o comando:

rails db:migrate
Taha20
fonte