1586 votes

Comment puis-je renommer une colonne de base de données dans un Rails de la migration?

J'ai mal nommé une colonne hased_password au lieu de hashed_password.

Comment puis-je utiliser une migration de renommer cette colonne?

2517voto

kwon Points 15464
rename_column :table, :old_column, :new_column

Mise à jour:

Vous aurez probablement envie de créer une migration pour ce faire. (Renommer FixColumnName comme vous voulez)

script/generate migration FixColumnName
# creates  db/migrate/xxxxxxxxxx_fix_column_name.rb

Puis modifiez la migration pour faire ta volonté.

# 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

Une mise à jour pour les Rails 3.1

Alors que, l' up et down méthodes s'appliquent toujours. Rails 3.1 reçoit un change méthode qui "sait comment migrer votre base de données et à l'inverse quand la migration est annulée sans le besoin d'écrire un distinct méthode"

rails g migration FixColumnName

class FixColumnName < ActiveRecord::Migration
  def change
    rename_column :table_name, :old_column, :new_column
  end
end

Si vous avez tout un tas de colonnes pour renommer, ou quelque chose qui aurait nécessité de répéter le nom de la table, encore et encore.

rename_column :table_name, :old_column1, :new_column1
rename_column :table_name, :old_column2, :new_column2
...

Vous pouvez utiliser change_table à garder les choses un peu plus soignée.

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

Merci, Luke && Turadg, pour amener le sujet.


Puis juste db:migrate comme d'habitude ou que vous allez sur votre entreprise.

72voto

elf.xf Points 280

l'omi dans ce cas mieux utiliser rake db:rollback. Ensuite modifier votre migration et de nouveau type rake db:migrate. Toutefois, si vous avez des données dans la colonne que vous ne voulez pas perdre, puis utilisez rename_column.

37voto

Paul Pettengill Points 1485

Si la colonne est déjà rempli avec des données et de vivre dans la production, je vous recommande une approche étape par étape, de manière à éviter les temps d'arrêt de la production pendant l'attente des migrations.

D'abord je voudrais créer une db migration pour ajouter des colonnes avec le nouveau nom(s) et les remplir avec les valeurs de l'ancien nom de la colonne.

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

Ensuite, j'ai commettre ce simple changement, et de pousser le changement dans la production.

git commit -m 'adding columns with correct name'

Puis, une fois que la livraison a été poussé dans la production, j'ai couru.

Production $ bundle exec rake db:migrate

Ensuite, je mettrais à jour toutes les vues et les contrôleurs qui fait référence à l'ancien nom de la colonne pour le nouveau nom de la colonne. Dans ma suite de tests, et de s'engager simplement ces changements. (Après s'être assuré de travailler localement et en passant tous les tests en premier!)

git commit -m 'using correct column name instead of old stinky bad column name'

Ensuite, j'ai push qui s'engagent à la production.

À ce stade, vous pouvez supprimer la colonne d'origine sans se soucier de toute sorte de temps d'arrêt liés à la migration elle-même.

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

Puis poussez cette dernière migration à la production et à exécuter bundle exec rake db:migrate dans l'arrière-plan.

Je réalise que c'est un peu plus complexe d'un processus, mais je préfère cela que d'avoir des problèmes avec ma production de migration.

28voto

James Manning Points 7989

http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

En vertu de l' Available Transformations

rename_column(table_name, column_name, new_column_name):

Renomme une colonne, mais conserve le type et le contenu.

17voto

super_p Points 172

À partir de l'API: rename_column(table_name, column_name, new_column_name): Renomme une colonne, mais conserve le type et le contenu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X