Como posso renomear uma coluna de banco de dados em um rubi na migração de trilhos?
-
22-09-2019 - |
Pergunta
Eu nomeei erroneamente uma coluna hased_password
ao invés de hashed_password
.
Como atualizo o esquema do banco de dados, usando a migração para renomear esta coluna?
Solução
rename_column :table, :old_column, :new_column
Atualizar:
Você provavelmente vai querer criar uma migração separada para fazer isso. (Renomeie fixColumnName como quiser)
script/generate migration FixColumnName
# creates db/migrate/xxxxxxxxxx_fix_column_name.rb
Em seguida, edite a migração para fazer sua vontade.
# db/migrate/xxxxxxxxxx_fix_column_name.rb
class FixColumnName < ActiveRecord::Migration
def self.up
rename_column :table_name, :old_column, :new_column
end
def self.down
# rename back if you need or do something else or do nothing
end
end
Uma atualização para o Rails 3.1
Enquanto o up
e down
Métodos ainda se aplicam. Rails 3.1 recebe um change
método que "Sabe como migrar seu banco de dados e revertê -lo quando a migração é revertida sem a necessidade de escrever um método separado"
rails g migration FixColumnName
class FixColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
Se você tiver um monte de colunas para renomear, ou algo que exigiria repetir o nome da tabela repetidamente.
rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...
Você poderia usar change_table
Para manter as coisas um pouco mais limpas.
class FixColumnNames < ActiveRecord::Migration
def change
change_table :table_name do |t|
t.rename :old_column1, :new_column1
t.rename :old_column2, :new_column2
...
end
end
end
Obrigada, Luke
&& Turadg
, por trazer à tona o tópico.
Então apenas db:migrate
Como de costume ou como você faz seu negócio.
Uma atualização para o Rails 4
Ao criar um Migration
Quanto a renomear uma coluna, o Rails 4 gera um change
método em vez de up
e down
Como mencionado na resposta acima. O gerado change
O método está abaixo:
$ > rails g migration ChangeColumnName
que criará um arquivo de migração semelhante a este:
class ChangeColumnName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
Outras dicas
IMO, neste caso, use melhor rake db:rollback
. Em seguida, edite sua migração e digite novamente rake db:migrate
. No entanto, se você tiver dados na coluna que não deseja perder, use rename_column
.
Se a coluna já estiver preenchida com dados e morar em produção, eu recomendaria uma abordagem passo a passo, para evitar o tempo de inatividade na produção enquanto aguarda as migrações.
Primeiro, eu criaria uma migração de banco de dados para adicionar colunas com o (s) novo (s) nome (s) e preencher -as com os valores do nome antigo da coluna.
class AddCorrectColumnNames < ActiveRecord::Migration
def up
add_column :table, :correct_name_column_one, :string
add_column :table, :correct_name_column_two, :string
puts 'Updating correctly named columns'
execute "UPDATE table_name SET correct_name_column_one = old_name_column_one, correct_name_column_two = old_name_column_two"
end
end
def down
remove_column :table, :correct_name_column_one
remove_column :table, :correct_name_column_two
end
end
Então eu comprometeria exatamente essa mudança e empurraria a mudança para a produção.
git commit -m 'adding columns with correct name'
Então, uma vez que a confirmação for empurrada para a produção, eu corri.
Production $ bundle exec rake db:migrate
Em seguida, eu atualizaria todas as visualizações/controladores que referenciaram o nome antigo da coluna para o novo nome da coluna. Execute minha suíte de teste e cometida apenas essas mudanças. (Depois de garantir que estava funcionando localmente e passando todos os testes primeiro!)
git commit -m 'using correct column name instead of old stinky bad column name'
Então eu pressionaria esse compromisso com a produção.
Nesse ponto, você pode remover a coluna original sem se preocupar com qualquer tipo de tempo de inatividade associado à própria migração.
class RemoveBadColumnNames < ActiveRecord::Migration
def up
remove_column :table, :old_name_column_one
remove_column :table, :old_name_column_two
end
def down
add_column :table, :old_name_column_one, :string
add_column :table, :old_name_column_two, :string
end
end
Em seguida, empurre esta última migração para a produção e corra bundle exec rake db:migrate
no fundo.
Sei que isso é um pouco mais envolvido em um processo, mas prefiro fazer isso do que ter problemas com minha migração de produção.
http://api.rubyonrails.org/classes/activerecord/migration.html
Debaixo Available Transformations
rename_column(table_name, column_name, new_column_name):
Renomeia uma coluna, mas mantém o tipo e o conteúdo.
Execute o comando abaixo para criar um arquivo de migração:
rails g migration ChangeHasedPasswordToHashedPassword
Então no arquivo gerado no db/migrate
Pasta, escreva rename_column
como abaixo:
class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
De API:
rename_column(table_name, column_name, new_column_name)
Ele renomeia uma coluna, mas mantém o tipo e o conteúdo permanecem iguais.
Algumas versões do Ruby on Rails Suporte para o método para cima/para baixo para migração e se você tiver o método UP/Down em sua migração, então:
def up
rename_column :table_name, :column_old_name, :column_new_name
end
def down
rename_column :table_name, :column_new_name, :column_old_name
end
Se você tem o change
Método em sua migração, então:
def change
rename_column :table_name, :column_old_name, :column_new_name
end
Para mais informações, você pode mover: Rubi nos trilhos - migrações ou Migrações de registro ativo.
Se o seu código não for compartilhado com outro, a melhor opção é fazer apenas rake db:rollback
Em seguida, edite o nome da sua coluna na migração e rake db:migrate
. É isso
E você pode escrever outra migração para renomear a coluna
def change
rename_column :table_name, :old_name, :new_name
end
É isso.
Se você precisar mudar de nomes de colunas, precisará criar um espaço reservado para evitar um Erro de nome da coluna duplicado. Aqui está um exemplo:
class SwitchColumns < ActiveRecord::Migration
def change
rename_column :column_name, :x, :holder
rename_column :column_name, :y, :x
rename_column :column_name, :holder, :y
end
end
Como uma opção alternativa, se você não for casado com a idéia de migrações, existe uma jóia atraente para o ActiveRecord, que lidará com as alterações de nome automaticamente para você, o estilo Datamapper. Tudo o que você faz é alterar o nome da coluna em seu modelo (e certifique -se de colocar Model.auto_upgrade! na parte inferior do seu modelo.rb) e viola! O banco de dados é atualizado em tempo real.
https://github.com/daddye/mini_record
NOTA: Você precisará db/schema.rb para evitar conflitos
Ainda em fases beta e, obviamente, não para todos, mas ainda é uma escolha atraente (atualmente estou usando-a em dois aplicativos de produção não trivial sem problemas)
Se os dados atuais não forem importantes para você, você poderá derrubar sua migração original usando:
rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'
Sem as citações, faça alterações na migração original e execute a migração novamente por:
rake db:migrate
Basta criar uma nova migração e em um bloco, use rename_column
como abaixo.
rename_column :your_table_name, :hased_password, :hashed_password
Para Ruby on Rails 4:
def change
rename_column :table_name, :column_name_old, :column_name_new
end
Manualmente, podemos usar o método abaixo:
Podemos editar a migração manualmente como:
Abrir
app/db/migrate/xxxxxxxxx_migration_file.rb
Atualizar
hased_password
parahashed_password
Execute o comando abaixo
$> rake db:migrate:down VERSION=xxxxxxxxx
Em seguida, ele removerá sua migração:
$> rake db:migrate:up VERSION=xxxxxxxxx
Ele adicionará sua migração com a alteração atualizada.
Gere o arquivo de migração:
rails g migration FixName
# Cria db/migre/xxxxxxxxxx.rb
Edite a migração para fazer sua vontade.
class FixName < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
Corre rails g migration ChangesNameInUsers
(ou o que você quiser nomear)
Abra o arquivo de migração que acabou de ser gerado e adicione essa linha no método (entre def change
e end
):
rename_column :table_name, :the_name_you_want_to_change, :the_new_name
Salve o arquivo e corra rake db:migrate
no console
Confira o seu schema.db
Para ver se o nome realmente mudou no banco de dados!
Espero que isto ajude :)
$: rails g migration RenameHashedPasswordColumn
invoke active_record
create db/migrate/20160323054656_rename_hashed_password_column.rb
Abra esse arquivo de migração e modifique esse arquivo como abaixo (digite seu original table_name
)
class RenameHashedPasswordColumn < ActiveRecord::Migration
def change
rename_column :table_name, :hased_password, :hashed_password
end
end
def change
rename_column :table_name, :old_column_name, :new_column_name
end
Gerar um rubi na migração de trilhos:
$:> rails g migration Fixcolumnname
Insira o código no arquivo de migração (xxxxxfixcolumnname.rb):
class Fixcolumnname < ActiveRecord::Migration
def change
rename_column :table_name, :old_column, :new_column
end
end
Vamos BEIJO. Só é preciso três etapas simples. O seguinte funciona para Rails 5.2.
1. Criar uma migração
rails g migration RenameNameToFullNameInStudents
rails g RenameOldFieldToNewFieldInTableName
- Dessa forma, é perfeitamente claro para os mantenedores da base de código posteriormente. (Use um plural para o nome da tabela).
2. Edite a migração
# I prefer to explicitly write the
acimaand
baixamethods.
# ./db/migrate/20190114045137_rename_name_to_full_name_in_students.rb
class RenameNameToFullNameInStudents < ActiveRecord::Migration[5.2]
def up
# rename_column :table_name, :old_column, :new_column
rename_column :students, :name, :full_name
end
def down
# Note that the columns are reversed
rename_column :students, :full_name, :name
end
end
3. Execute suas migrações
rake db:migrate
E você vai para as corridas!
Abra seu rubi no Console do Rails e entre:
ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column
Você tem duas maneiras de fazer isso:
Nesse tipo, ele executa automaticamente o código reverso dele, quando a reversão.
def change rename_column :table_name, :old_column_name, :new_column_name end
Para esse tipo, ele executa o método UP quando
rake db:migrate
e executa o método para baixo quandorake db:rollback
:def self.up rename_column :table_name, :old_column_name, :new_column_name end def self.down rename_column :table_name,:new_column_name,:old_column_name end
Estou no Rails 5.2 e tentando renomear uma coluna em um usuário de invenção.
a rename_column
um pouco funcionou para mim, mas o singular :table_name
lançou um erro "Tabela de usuários não encontrada". Plural funcionou para mim.
rails g RenameAgentinUser
Em seguida, altere o arquivo de migração para isso:
rename_column :users, :agent?, :agent
Onde: agente? é o nome antigo da coluna.
Apenas gerar migração usando o comando
rails g migration rename_hased_password
Depois disso, edite a migração adicionar a linha seguinte no método de mudança
rename_column :table, :hased_password, :hashed_password
Isso deve fazer o truque.
Trilhos 5 mudanças de migração
por exemplo:
Rails g Modelo
Se você quiser mudar nome do aluno coluna como nome
Nota:- Se você não correr Rails DB: migrar
Você pode fazer as seguintes etapas
Rails D Modelo
Isso removerá o arquivo de migração gerado, agora você pode corrigir o nome da sua coluna
Rails g Modelo Nome do aluno: Idade da corda: Inteiro
Se você migrou (Rails DB: Migre), seguindo as opções para alterar o nome da coluna
Rails g RemovestudentName de migração de estudante de estudante: string: string
Rails g Migração AddNameTostudent Nome: String
Atualizar - Um primo próximo de create_table é alteração_table, usado para alterar as tabelas existentes. É usado de maneira semelhante ao create_table, mas o objeto produzido ao bloco conhece mais truques. Por exemplo:
class ChangeBadColumnNames < ActiveRecord::Migration
def change
change_table :your_table_name do |t|
t.rename :old_column_name, :new_column_name
end
end
end
Dessa forma, é mais eficiente se o fizermos com outros métodos de alteração, como: Remover/Adicionar Índice/Remover Índice/Adicionar Coluna, por exemplo, podemos fazer ainda mais:
# Rename
t.rename :old_column_name, :new_column_name
# Add column
t.string :new_column
# Remove column
t.remove :removing_column
# Index column
t.index :indexing_column
#...