Comment supprimer des colonnes à l'aide de la migration Rails

Réponses:

917
remove_column :table_name, :column_name

Par exemple:

remove_column :users, :hobby

supprimerait la colonne hobby de la table des utilisateurs.

Nick Hammond
la source
9
Et assurez-vous de le faire à l'intérieur upet sur les downméthodes, non change, comme expliqué dans la réponse de @Powers.
XåpplI'-I0llwlg'I -
7
@ XåpplI'-I0llwlg'I-Merci pour le commentaire. La méthode de modification peut être utilisée pour supprimer une colonne dans les applications Rails 4, mais ne doit pas être utilisée dans Rails 3. J'ai mis à jour ma réponse en conséquence.
Pouvoirs
9
Vous pouvez également l'utiliser remove_column :table_name, :column_name, :type, :optionsdans la changeméthode, car si vous spécifiez le type, la migration est possible. De la documentation: Les paramètres typeet optionsseront ignorés s'ils sont présents. Il peut être utile de les fournir dans une changeméthode de migration afin de pouvoir les annuler. Dans ce cas, typeet optionssera utilisé par add_column.
Nicolas
24
Dans Rails4, vous pouvez supprimer une colonne dans la changeméthode, mais uniquement si vous spécifiez le type de colonne. Par exemple remove_column, :table_name, :column_name, :column_type. Sinon, vous obtiendrez l'erreur suivante lorsque vous tenterez d'exécuter la migration:remove_column is only reversible if given a type
Dennis
5
Il peut être intéressant de noter dans la réponse principale que la suppression d'une colonne ne supprime pas l'index correspondant s'il existe
idem
371

Pour les anciennes versions de Rails

ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype

Pour Rails 3 et plus

rails generate migration RemoveFieldNameFromTableName field_name:datatype
prabu
la source
18
"rails g" peut être utilisé comme une alternative à "rails générer"
Noz
44
rails g migration remove_field_name_from_table_name field_name:datatypefonctionne également
Stuart Nelson
6
Notez également que AddXXXtoTTTan RemoveXXXFromTTTpeut être suivi d'une liste d'espacement blanc de nom_dossier: type_données, et les instructions add_column et remove_column appropriées seront créées: rails g migration RemoveUnusefulFieldsFromUsers hair_color:string favorite_number:integersupprime deux attributs à l'aide d'une seule migration. Notez également que ce remove_columnn'est pas pris en charge par la changeméthode, vous devez donc écrire à la fois upet down.
Claudio Floreani
3
Rails 4 semble prendre en charge changecela. La restauration fonctionne comme il se doit.
Unknown_Guy
2
@AdamGrant Je pense que si vous utilisez une changeméthode qui peut être annulée *, vous devrez informer le type de données (et tous les autres modificateurs de champ), donc si vous annulez cette migration, le champ peut être correctement recréé. * Quand je dis rétabli, c'est en termes de structure de base de données, bien sûr, les données de cette colonne seront évidemment perdues.
RFVoltolini
117

Rails 4 a été mis à jour, donc la méthode de modification peut être utilisée dans la migration pour supprimer une colonne et la migration réussira. Veuillez lire l'avertissement suivant pour les applications Rails 3:

Avertissement Rails 3

Veuillez noter que lorsque vous utilisez cette commande:

rails generate migration RemoveFieldNameFromTableName field_name:datatype

La migration générée ressemblera à ceci:

  def up
    remove_column :table_name, :field_name
  end

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

Assurez-vous de ne pas utiliser la méthode de modification lors de la suppression de colonnes d'une table de base de données (exemple de ce que vous ne voulez pas dans le fichier de migration dans les applications Rails 3):

  def change
    remove_column :table_name, :field_name
  end

La méthode de changement dans Rails 3 n'est pas intelligente en ce qui concerne remove_column, vous ne pourrez donc pas annuler cette migration.

Pouvoirs
la source
3
puis lancez rake db: migrate
roxdurazo
1
@Powers - réponse brillante et claire - seriez-vous en mesure d'élaborer sur ce qui suit: "La méthode de changement dans Rails 3 n'est pas intelligente en ce qui concerne remove_column, vous ne pourrez donc pas annuler cette migration."
BKSpurgeon
1
@BKSpurgeon - Dans Rails 3, si vous utilisez la changeméthode, la rake db:rollbackcommande affichera une erreur. rake db:rollbackest fondamentalement l'opposé de rake db:migrate. Ce bug a été corrigé dans Rails 4 :)
Powers
2
Dans Rails 4, j'ai essayé de restaurer une colonne de modification. Il échoue et indique que vous devez spécifier data_type (comme dans votre code bas dans votre réponse)
rmcsharry
1
Le même problème s'est produit pour moi que pour @rmcsharry. Ma version de rails est 4.2.2 et j'ai utilisé la méthode de changement. quand j'ai essayé de revenir en arrière, une erreur s'est produite que remove_column n'est réversible que si on lui donne un type.
M. Habib
38

Dans une application rails4, il est également possible d'utiliser la méthode de modification pour supprimer des colonnes. Le troisième paramètre est le data_type et dans le quatrième optionnel, vous pouvez donner des options. C'est un peu caché dans la section 'Transformations disponibles' de la documentation .

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

Il existe deux bonnes façons de procéder:

remove_column

Vous pouvez simplement utiliser remove_column, comme ceci:

remove_column :users, :first_name

C'est très bien si vous avez seulement besoin d'apporter une seule modification à votre schéma.

bloc change_table

Vous pouvez également le faire en utilisant un bloc change_table, comme ceci:

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

Je préfère cela car je le trouve plus lisible, et vous pouvez apporter plusieurs modifications à la fois.

Voici la liste complète des méthodes change_table prises en charge:

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

superluminaire
la source
15

dans rails 5, vous pouvez utiliser cette commande dans le terminal:

rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE

par exemple pour supprimer la colonne access_level (chaîne) des utilisateurs de table:

rails generate migration remove_access_level_from_users access_level:string

puis exécutez:

rake db:migrate
aschmid
la source
14

Générez une migration pour supprimer une colonne de sorte que si elle est migrée ( rake db:migrate), elle doit supprimer la colonne . Et il devrait ajouter une colonne en arrière si cette migration est annulée ( rake db:rollback).

La syntaxe:

remove_column: nom_table,: nom_colonne,: type

Supprime la colonne, ajoute également la colonne en arrière si la migration est annulée.

Exemple:

remove_column :users, :last_name, :string

Remarque : Si vous ignorez le type de données , la migration supprimera la colonne avec succès mais si vous annulez la migration, une erreur se produira.

Imran Ahmad
la source
13

Instructions claires et simples pour Rails 5.2

  • AVERTISSEMENT: vous perdrez des données si vous supprimez une colonne de votre base de données . Pour continuer, voir ci-dessous:
  • Avertissement: les instructions ci-dessous concernent les migrations triviales . Pour les migrations complexes avec par exemple des millions et des millions de lignes, vous devrez tenir compte de la possibilité d'échecs, vous devrez également réfléchir à la façon d'optimiser vos migrations afin qu'elles s'exécutent rapidement et à la possibilité que les utilisateurs utilisent votre application tout en le processus de migration est en cours. Si vous avez plusieurs bases de données ou si quelque chose est compliqué à distance, ne me blâmez pas si quelque chose se passe mal!

1. Créez une migration

Exécutez la commande suivante dans votre terminal:

rails generate migration remove_fieldname_from_tablename fieldname:fieldtype

Remarque: le nom de la table doit être au pluriel selon la convention des rails.

Exemple:

Dans mon cas, je veux supprimer la acceptedcolonne (une valeur booléenne) du quotestableau:

rails g migration RemoveAcceptedFromQuotes accepted:boolean

Voir la documentation concernant une convention lors de l'ajout / suppression de champs à une table:

Il existe un raccourci syntaxique spécial pour générer des migrations qui ajoutent des champs à une table.

les rails génèrent la migration add_fieldname_to_tablename fieldname: fieldtype

2. Vérifiez la migration

# 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. Exécutez la migration

rake db:migrate

.... Et puis c'est parti pour les courses!

BKSpurgeon
la source
maintenant les migrations peuvent également être exécutées en tant querails db:migrate
Imran Ali
12

Supprimer les colonnes de l'application RAILS 5

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

La commande ci-dessus génère un fichier de migration dans le db/migraterépertoire. L'extrait de coup est l'un des exemples de suppression de colonne de la table généré par le générateur Rails,

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

J'ai également fait un guide de référence rapide pour Rails qui peut être trouvé ici .

Lorem Ipsum Dolor
la source
11

Vous pouvez essayer ce qui suit:

remove_column :table_name, :column_name

( Documentation officielle )

Jordan Running
la source
10
rails g migration RemoveXColumnFromY column_name:data_type

X = nom de colonne
Y = nom de table

ÉDITER

Modifié RemoveXColumnToYen RemoveXColumnFromYfonction des commentaires - fournit plus de clarté sur ce que fait réellement la migration.

Eden
la source
3
« Colonne Supprimer la table » peut paraître étrange, donc de semble être le meilleur choix ici.
Sebastian vom Meer
@SebastianvomMeer oui je suis d'accord - l'anglais se lit beaucoup mieux avec "from"
BKSpurgeon
8

Pour supprimer la colonne du tableau, vous devez exécuter la migration suivante:

rails g migration remove_column_name_from_table_name column_name:data_type

Exécutez ensuite la commande:

rake db:migrate
Koresol
la source
5

Donnez la commande ci-dessous, elle ajoutera son propre fichier de migration

rails g migration RemoveColumnFromModel

Après avoir exécuté la commande ci-dessus, vous pouvez vérifier que le fichier de migration remove_column doit y être ajouté seul

Migrez ensuite la base de données

rake db:migrate
blague
la source
5

remove_columnLa changeméthode in vous aidera à supprimer la colonne du tableau.

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

Allez sur ce lien pour une référence complète: http://guides.rubyonrails.org/active_record_migrations.html

Dharmesh Rupani
la source
5

Pour supprimer la colonne du tableau en 3 étapes simples:

  1. écrire cette commande

rails g migration remove_column_from_table_name

après avoir exécuté cette commande dans le terminal, un fichier créé par ce nom et l'horodatage (remove_column from_table_name).

Allez ensuite dans ce fichier.

  1. à l'intérieur du fichier, vous devez écrire

    remove_column :table_name, :column_name

  2. Allez enfin à la console puis faites

    rake db:migrate

Karan Bamniya
la source
2

Voici une autre console de rails

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

tenzin dorjee
la source
1

Dans
remove_column :table_name, :column_name
un fichier de migration

Vous pouvez supprimer une colonne directement dans une console de rails en tapant:
ActiveRecord::Base.remove_column :table_name, :column_name

Manh Cuong
la source
1

Fait comme ça;

rails g migration RemoveColumnNameFromTables column_name:type

C'est à dire rails g migration RemoveTitleFromPosts title:string

Quoi qu'il en soit, il serait préférable de prendre également en compte les temps d'arrêt, car ActiveRecord met en cache les colonnes de la base de données au moment de l'exécution, donc si vous supprimez une colonne, cela peut provoquer des exceptions jusqu'à ce que votre application redémarre.

Réf: Forte migration

Nuttapon
la source
1

Simplement, vous pouvez supprimer la colonne

remove_column :table_name, :column_name

Par exemple,

remove_column :posts, :comment
Foram Thakral
la source
1

essayez d'abord de créer un fichier de migration en exécutant la commande:

rails g migration RemoveAgeFromUsers age:string

puis sur le répertoire racine du projet, exécutez la migration en exécutant la commande:

rails db:migrate
Taha20
la source