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?

Foi útil?

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:rollbackEm 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 para hashed_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 theacimaandbaixamethods.

# ./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:

  1. 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
    
  2. Para esse tipo, ele executa o método UP quando rake db:migrate e executa o método para baixo quando rake 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
#...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top