Ruby on Rails: Comment puis-je annuler une migration avec rake db: migrate?

94

Après avoir installé le modèle utilisateur de modèle, j'ai obtenu ceci.

class DeviseCreateUsers < ActiveRecord::Migration
  def self.up
    create_table(:users) do |t|
      t.database_authenticatable :null => false
      t.recoverable
      t.rememberable
      t.trackable

      # t.encryptable
      # t.confirmable
      # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
      # t.token_authenticatable


      t.timestamps
    end

    add_index :users, :email,                :unique => true
    add_index :users, :reset_password_token, :unique => true
    # add_index :users, :confirmation_token,   :unique => true
    # add_index :users, :unlock_token,         :unique => true
    # add_index :users, :authentication_token, :unique => true
  end

  def self.down
    drop_table :users
  end
end

Maintenant, si je rake db: migrer la table des utilisateurs sera créée.

Comment puis-je annuler cette migration, c'est-à-dire comment supprimer à nouveau la table des utilisateurs à l'aide de rake?

modérément
la source

Réponses:

147

Exécutez la commande suivante

rake db:migrate:down VERSION=<version>

<version>est le numéro de version de votre fichier de migration que vous souhaitez restaurer.

par exemple. si vous souhaitez annuler une migration avec le nom de fichier 3846656238_create_users.rb

rake db: migrate: down VERSION = 3846656238

Mahesh
la source
J'obtiens un UnknownMigrationVersionErrormais j'ai compris que c'est parce que mes migrations sont à l'intérieur db/migrate/main, est-ce que quelqu'un connaît une solution de contournement pour que cela db:migrate:downregarde dans ce répertoire spécifique ou dans les sous-répertoires de migration?
tf.rz
Ceci est juste pour les rails 3 et suivants. Ma vie est dans les rails 2. Tellement triste
morhook
@morhook Cela fonctionne également pour les rails 3. Consultez la documentation ici guides.rubyonrails.org/v3.2/migrations.html
Mahesh
Vous avez raison! Cela fonctionne pour les rails 2 et les rails 3. Merci @Mahesh pour votre contribution!
morhook
114

Exécutez simplement cette commande:

rake db:rollback
Damienbrz
la source
65

Je pense qu'il existe trois options disponibles pour annuler les migrations (elles se chevauchent également):

  1. Roll down la migration la plus récente :

    rake db:migrate:down # Rails 2 uniquement.

  2. Roll down un certain nombre (n) de migrations récentes:

    rake db:rollback STEP=n

  3. Passer à une version précédente et spécifique :

    $ rake db:migrate:down VERSION=nnn # Rails 3 (indiquez également le numéro de version).

Numéro de version signifie le SHA (Secure Hash Algorithm) pour le commit qui est un long nombre hexadécimal qui ressemble à 886af3194768917c78e ... Vous pouvez le voir en faisant git log

Vous pouvez voir ces commandes (et d'autres) avec leurs descriptions en utilisant rake -T db:ce qui inclut for rails 3.2:

rake db:migrate         # Migrate the database (options: VERSION=x, VERBOSE=false)
rake db:migrate:status  # Display status of migrations
rake db:rollback        # Rolls the schema back to the previous version (specify steps w/ STEP=n)
Michael Durrant
la source
5
Passer à une version spécifique:rake db:migrate VERSION=<version number>
Ajedi32
3
Au moins pour les rails 3.0.20, la première commande est erronée. Un seul rake db:migrate:downabandonne avec le message d'erreur "VERSION est requise". Le recommandé rake db:rollback fonctionne cependant.
martin
Comme détaillé dans la réponse, Rails 2 UNIQUEMENT pour la première commande.
Michael Durrant
1
Les variables d'environnement sont sensibles à la casse, il devrait donc l'être STEPetVERSION
Kostas Rousis
Pour clarifier, $ rake db:migrate:down VERSION=nnnne passe pas à une version, il migre vers le bas de la version spécifiée.
johnml
15

Vous pouvez effectuer une restauration et spécifier le nombre de dernières migrations qui seront annulées, par exemple

rake db:rollback STEP=3

pour 3 dernières migrations.

cintreuse
la source
c'est un moyen plus rapide et plus simple, au lieu de rechercher les numéros de version si vous souhaitez annuler les dernières migrations
Préalpha
11

En tant que nouveau programmeur (ou à d'autres nouveaux programmeurs)

rake db:rollbackfonctionne environ la moitié du temps. Je commence par là.

Si non, rake db:migrate:down VERSION=3846656238

branchez VERSION pour le numéro de version de votre fichier de migration que vous souhaitez rétablir.

LukeBickleTWA
la source
10
rake db:migrate:redo

Il annulera et réappliquera la dernière migration.

Keneth
la source
5

Pour les rails 5, nous pouvons utiliser rails command instead of rake

rails db:migrate:down VERSION=<version>

exemple

rails db: migrate: down VERSION = 20170330090327

Mihir Kumar Thakur
la source
2

Exécutez cette commande dans votre terminal:

rake db:migrate:status

ou

bundle exec rake db:migrate:status

Il montre l'état, les ID de migration et le nom de la migration pour toutes les migrations que nous avons exécutées précédemment. sélectionnez votre identifiant de migration (c'est-à-dire votre numéro de version) et mettez cet identifiant dans la commande suivante après version = ,,, et appuyez sur Entrée

bundle exec rake db:migrate:down VERSION=
Arun JP
la source
0

Comment annuler une migration

(1) Identifiez d'abord l'ID de migration

rake db:migrate:status

  • Copiez le numéro d'identification.

Identifiez la migration à restaurer.

(2) Puis annulez la migration

rake db:migrate:down VERSION=20190802023239

  • Collez le numéro d'identification approprié ci-dessus. Bien sûr, dans votre cas, l'ID de migration sera différent! Utilisez l'ID de migration correct.

....... et maintenant vous partez pour les courses!

BKSpurgeon
la source