ruby-on-rails db:migrate - Comment puis-je renommer une colonne de base de données dans une migration Ruby on Rails?




references generate (21)

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

Comment mettre à jour le schéma de base de données, en utilisant la migration pour renommer cette colonne?


Answers

Si vous devez changer de nom de colonne, vous devrez créer un espace réservé pour éviter une erreur de nom de colonne en double . Voici un exemple:

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

Générer une migration Ruby on Rails :

$:> rails g migration Fixcolumnname

Insérer le code dans le fichier de migration (XXXXXfixcolumnname.rb) :

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

Pour Ruby on Rails 4:

def change
    rename_column :table_name, :column_name_old, :column_name_new
end

Il suffit de générer la migration en utilisant la commande

rails g migration rename_hased_password

Après cette modification, la migration ajoute la ligne suivante dans la méthode de modification

rename_column :table, :hased_password, :hashed_password

Cela devrait faire l'affaire.


Rails 5 changements de migration

par exemple:

rails g modèle Student student_name: string âge: entier

si vous voulez changer la colonne student_name en nom

Note: - si vous n'exécutez pas de rails db: migrez

Vous pouvez faire les étapes suivantes

rails d modèle Student student_name: chaîne âge: entier

Cela va supprimer le fichier de migration généré, maintenant vous pouvez corriger le nom de votre colonne

rails g model Nom de l'étudiant: string age: integer

Si vous avez migré (rails db: migrate), suivez les options pour changer le nom de la colonne

rails g migration RemoveStudentNameFromStudent nom_élève: chaîne

rails g migration AddNameToStudent nom: chaîne


De l'API:

rename_column(table_name, column_name, new_column_name)

Il renomme une colonne mais conserve le même type et le même contenu.


Comme option alternative, si vous n'êtes pas marié à l'idée de migrations, il y a une gemme convaincante pour ActiveRecord qui gérera les changements de nom automatiquement pour vous, style Datamapper. Tout ce que vous faites est de changer le nom de la colonne dans votre modèle (et assurez-vous de mettre Model.auto_upgrade! Au bas de votre model.rb) et l'alto! La base de données est mise à jour à la volée.

https://github.com/DAddYE/mini_record

Note: Vous aurez besoin de nuke db / schema.rb pour éviter les conflits

Toujours en phase bêta et évidemment pas pour tout le monde mais toujours un choix convaincant (je l'utilise actuellement dans deux applications de production non triviales sans problèmes)


Si votre code n'est pas partagé avec un autre, alors la meilleure option est de faire juste rake db:rollback puis éditez votre nom de colonne dans la migration et rake db:migrate . C'est tout

Et vous pouvez écrire une autre migration pour renommer la colonne

 def change
    rename_column :table_name, :old_name, :new_name
  end

C'est tout.


rename_column :table, :old_column, :new_column

Mettre à jour:

Vous souhaiterez probablement créer une migration distincte pour cela. (Renommez FixColumnName comme vous voulez)

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

Puis modifiez la migration pour faire votre 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 Rails 3.1

Bien que, les méthodes up et down s'appliquent toujours. Rails 3.1 reçoit une méthode de change qui "sait comment migrer votre base de données et l'annuler lorsque la migration est annulée sans qu'il soit nécessaire d'écrire une méthode distincte"

rails g migration FixColumnName

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

Si vous avez un tas de colonnes à 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 pour garder les choses un peu plus propres.

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 , d'avoir abordé le sujet.

Ensuite, juste db:migrate comme d'habitude ou comme vous allez dans votre entreprise.

Une mise à jour pour Rails 4

Lors de la création d'une Migration comme pour renommer une colonne, Rails 4 génère une méthode de change au lieu de up et down comme mentionné dans la réponse ci-dessus. La méthode de change générée est la suivante:

$ > rails g migration ChangeColumnName

qui va créer un fichier de migration similaire à ceci:

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

Vous avez deux façons de le faire:

  1. Dans ce type, il exécute automatiquement le code inverse de celui-ci, lors de la restauration.

    def change
      rename_column :table_name, :old_column_name, :new_column_name
    end
    
  2. Pour ce type, il exécute la méthode up lorsque rake db:migrate et exécute la méthode down lorsque 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
    

 def change
    rename_column :table_name, :old_column_name, :new_column_name
  end


Si les données présentes ne sont pas importantes pour vous, vous pouvez simplement annuler votre migration d'origine en utilisant:

rake db:migrate:down VERSION='YOUR MIGRATION FILE VERSION HERE'

Sans les guillemets, modifiez la migration d'origine et relancez la migration en procédant comme suit:

rake db:migrate

Générer le fichier de migration:

rails g migration FixName

# Crée db / migrate / xxxxxxxxxx.rb

Editez la migration pour faire votre volonté.

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

Ouvrez votre console Ruby on Rails et entrez:

ActiveRecord::Migration.rename_column :tablename, :old_column, :new_column

IMO, dans ce cas, mieux utiliser rake db:rollback . Ensuite, éditez votre migration et tapez à nouveau rake db:migrate . Cependant, si vous avez des données dans la colonne que vous ne voulez pas perdre, utilisez rename_column .


$:  rails g migration RenameHashedPasswordColumn
invoke  active_record
      create    db/migrate/20160323054656_rename_hashed_password_column.rb

Ouvrez ce fichier de migration et modifiez ce fichier comme indiqué ci-dessous (Ne saisissez pas votre table_name origine)

class  RenameHashedPasswordColumn < ActiveRecord::Migration
  def change
    rename_column :table_name, :hased_password, :hashed_password
  end
end

Mise à jour - Un cousin proche de create_table est change_table, utilisé pour changer les tables existantes. Il est utilisé de la même manière que create_table mais l'objet cédé au bloc en sait plus. Par exemple:

class ChangeBadColumnNames < ActiveRecord::Migration
  def change
    change_table :your_table_name do |t|
      t.rename :old_column_name, :new_column_name
    end
  end
end

Cette méthode est plus efficace si nous utilisons d'autres méthodes telles que: supprimer / ajouter un index / supprimer un index / ajouter une colonne, par exemple, nous pouvons faire plus comme:

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

Manuellement, nous pouvons utiliser la méthode ci-dessous:

Nous pouvons éditer la migration manuellement comme:

  • Ouvrez app/db/migrate/xxxxxxxxx_migration_file.rb

  • Mise à jour de hased_password à hashed_password

  • Exécutez la commande ci-dessous

    $> rake db:migrate:down VERSION=xxxxxxxxx
    

Ensuite, il supprimera votre migration:

$> rake db:migrate:up VERSION=xxxxxxxxx

Il ajoutera votre migration avec le changement mis à jour.


Exécutez la commande ci-dessous pour créer un fichier de migration:

rails g migration ChangeHasedPasswordToHashedPassword

Ensuite, dans le fichier généré dans le dossier db/migrate , écrivez rename_column comme suit:

class ChangeOldCoulmnToNewColumn < ActiveRecord::Migration
  def change
     rename_column :table_name, :hased_password, :hashed_password
  end
end

Vous pouvez utiliser db:reset - pour exécuter db: drop et db: setup ou db:migrate:reset - qui exécute db: drop, db: create et db: migrate.

en fonction de vous voulez utiliser Exister schema.rb





ruby-on-rails ruby-on-rails-3 migration