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?

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


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


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)

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.


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.


10
rake db:migrate:redo

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


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


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=

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!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.