148 votes

Ruby on Rails : Comment ajouter une contrainte non nulle à une colonne existante en utilisant une migration ?

Dans mon application Rails (3.2), j'ai un tas de tables dans ma base de données mais j'ai oublié d'ajouter quelques contraintes not null. Comment puis-je écrire une migration qui ajoute not null à une colonne existante ?

303voto

nates Points 1227

Vous pouvez également utiliser change_column_null :

change_column_null :table_name, :column_name, false

1 votes

J'ai dû le modifier pour un certain nombre de colonnes et cela ne nécessite pas de spécifier le type de colonne pour chaque colonne, c'est bien mieux !

1 votes

Voici la meilleure réponse. Dans ma base de données, j'ajoutais une contrainte nulle sur une colonne avec des valeurs nulles préexistantes. change_column ne mettait pas à jour ces valeurs. Selon la documentation, change_column_null a une quatrième valeur facultative qui est la nouvelle valeur pour la mise à jour.

0 votes

Merci pour cela. Meilleure réponse.

97voto

Dan Wich Points 2923

Pour Rails 4+, la réponse de nates (en utilisant change_column_null ) est préférable.

Pré-Rails 4, essayez changer_colonne .

26 votes

Soyez prudent avec cette approche -- si vous avez d'autres attributs concernant cette colonne (par exemple un :limit ), vous devez répéter ces attributs lorsque vous utilisez la contrainte change_column ou ils seront perdus. Pour cette raison, je préfère utiliser change_column_null

0 votes

Notez que cela génère un IrreversibleMigration ce qui n'est peut-être pas ce que vous voulez.

0 votes

@NicNilov parlez-vous de la réponse OU du commentaire de Nathan Wallace ?

12voto

rndrfero Points 16
  1. Ajouter une colonne avec une valeur par défaut

  2. Supprimer la valeur par défaut

    add_column :orders, :items, :integer, null: false, default: 0 change_column :orders, :items, :integer, default: nil

3voto

user2541141 Points 1

Si vous l'utilisez sur une nouvelle migration create script/schema voici comment nous pouvons le définir

class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
    t.string :name, null: false     # Notice here, NOT NULL definition
    t.string :email, null: false
    t.string :password, null: false
    t.integer :created_by
    t.integer :updated_by 

    t.datetime :created_at
    t.datetime :updated_at, default: -> { 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' }
   end
  end
end

0voto

Thien Ngan Points 21

Dans mon approche, j'ajoute la contrainte NOT NULL aux colonnes dont j'ai besoin dans ma migration existante. Après cela, je réinitialise toutes mes migrations en utilisant cette commande :

rake db:migrate:reset

Cela va supprimer la base de données, la recréer et exécuter toutes les migrations. Vous pouvez vérifier vos changements dans schema.rb.

Si vous avez peu de colonnes dans les migrations simples, vous pouvez utiliser cette approche.

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