Comment annuler une migration spécifique?

808

J'ai le fichier de migration suivant db\migrate\20100905201547_create_blocks.rb

Comment annuler spécifiquement ce fichier de migration?

Un apprenti
la source
1
Est-ce que cela résout le problème? Vous aurez juste besoin de faire Class.down stackoverflow.com/questions/753919/run-a-single-migration-file
danivovich
4
Toutes les informations sur les migrations ici
Nishutosh Sharma
1
Voulez-vous annuler uniquement cette migration spécifique unique (même si de nouvelles migrations viennent après)? Ou souhaitez-vous restaurer la base de données dans l'état dans lequel elle se trouvait avant cette migration, et toutes les migrations ultérieures ont été appliquées?
Jon Schneider

Réponses:

1342
rake db:rollback STEP=1

Est un moyen de le faire, si la migration que vous souhaitez annuler est la dernière appliquée. Vous pouvez remplacer 1 par le nombre de migrations que vous souhaitez revenir en arrière.

Par exemple:

rake db:rollback STEP=5

Annulera également toutes les migrations qui se sont produites plus tard (4, 3, 2 et également 1).

Pour restaurer toutes les migrations vers (et y compris) une migration cible, utilisez: (Cette commande corrigée a été ajoutée APRÈS tous les commentaires signalant l'erreur dans le message d'origine)

rake db:migrate VERSION=20100905201547

Afin d'annuler UNE SEULE migration spécifique (HORS COMMANDE), utilisez:

rake db:migrate:down VERSION=20100905201547

Notez que cela n'annulera PAS les migrations intercédantes - uniquement celle répertoriée. Si ce n'est pas ce que vous vouliez, vous pouvez exécuter en toute sécurité rake db:migrateet il ne réexécutera que celui-ci, en ignorant tous les autres qui n'ont pas été annulés auparavant.

Et si jamais vous souhaitez migrer une seule migration dans le désordre, il y a aussi son inverse db:migrate:up:

rake db:migrate:up VERSION=20100905201547
Zachary Wright
la source
14
"Afin de revenir à une version spécifique" - la commande qui suit ne fait-elle que restaurer une migration spécifique, plutôt que de revenir à cette version?
Andrew Grimm
10
"Afin de revenir à une version spécifique, utilisez ..." Cette réponse est incorrecte! Cela annulera la migration de manière isolée, comme expliqué par d'autres réponses.
Rhys van der Waerden
3
AVERTISSEMENT: j'ai fait cette erreur: utilisez uniquement rake db: migrate: down VERSION = 20100905201547 pour revenir en arrière dans l'isolement !!! un fichier de migration. Cela est mentionné dans le commentaire ci-dessus, mais je l'ai manqué.
pixelearth
3
Un autre mot d'avertissement - ne le faites jamais STEP=-1. Je l'ai fait une fois et c'est devenu fou, tout a reculé. Pas gentil! C'était Rails 4.2 - je suppose qu'il peut être corrigé maintenant.
Dave Hartnoll
1
A écrit un article dans mon blog sur les migrations, qui explique comment et quand utiliser ces commandes: railsguides.net/polish-rails-migrations
ka8725
868
rake db:migrate:down VERSION=20100905201547

restaurera le fichier spécifique.


Pour trouver la version de toutes les migrations, vous pouvez utiliser cette commande:

rake db:migrate:status

Ou, le préfixe du nom de fichier de la migration est simplement la version dont vous avez besoin pour restaurer.


Voir l'entrée de guide Ruby on Rails sur les migrations.

John Creamer
la source
48
Certainement la réponse préférée à mon avis.
streetlogics
30
Il convient de mentionner que si vous annulez une migration spécifique et que vous ne souhaitez pas qu'elle migre à nouveau sur les tâches de râteau à venir, supprimez également le fichier de migration.
BradGreens
4
Remarque: il semble que si la migration vers le haut n'a jamais réussi mais n'a été que partiellement exécutée, la descente ne fait rien.
cyrilchampier
1
@nerith, c'est probablement vrai uniquement pour les bases de données qui ne prennent pas en charge le DDL transactionnel. MySQL ne prend pas en charge le DDL transactionnel: dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html PostreSQL le fait: wiki.postgresql.org/wiki/… Donc, si votre migration sur la base de données MySQL est interrompue vous devez ensuite supprimer manuellement une partie de la migration qui a réussi.
Иван Бишевац
1
Une autre observation concernant le commentaire @BradGreens. Si vous souhaitez supprimer le fichier de migration et qu'il a déjà été déployé, vous souhaiterez annuler la production / le transfert avant de valider le code avec le fichier supprimé. Sinon, vous ne pourrez pas annuler / migrer: vers le bas.
AdamT
57

Pour annuler la dernière migration, vous pouvez effectuer:

rake db:rollback

Si vous souhaitez annuler une migration spécifique avec une version, vous devez:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Par exemple, si la version est 20141201122027, vous ferez:

rake db:migrate:down VERSION=20141201122027

pour annuler cette migration spécifique.

Waleed
la source
32

Vous pouvez annuler votre migration en utilisant rake db:rollbackdifférentes options. La syntaxe sera différente selon vos besoins.

Si vous souhaitez annuler uniquement la dernière migration, vous pouvez utiliser soit

rake db:rollback

ou

rake db:rollback STEP=1

Si vous souhaitez restaurer le nombre de migrations à la fois, vous passez simplement un argument:

rake db:rollback STEP=n

nest le nombre de migrations à annuler, à compter de la dernière migration.

Si vous souhaitez revenir à une migration spécifique, vous devez transmettre la version de la migration comme suit:

rake db:migrate:down VERSION=xxxxx

où xxxxx est le numéro de version de la migration.

uma
la source
1
ajoutant: down ne fonctionne pas cependant, la bonne réponse est sans down
Elta3lab
26

rake db:migrate:down VERSION=your_migrations's_version_number_here

La version est le préfixe numérique du nom de fichier de la migration

Comment trouver la version :

Vos fichiers de migration sont stockés dans votre rails_root/db/migraterépertoire. Recherchez le fichier approprié dans lequel vous souhaitez annuler et copiez le numéro de préfixe.

par exemple

nom de fichier: 20140208031131_create_roles.rb alors la version est20140208031131

Hardik
la source
6
La façon la plus simple de trouver l'ID de migration est d'exécuterrake db:migrate:status
Aeradriel
18

Annulation de la dernière migration:

# rails < 5.0
rake db:rollback

# rails >= 5.0
rake db:rollback
# or
rails db:rollback

Annulation du dernier nnombre de migrations

# rails < 5.0
rake db:rollback STEP=2

# rails >= 5.0
rake db:rollback STEP=2
# or
rails db:rollback STEP=2

Annulation d'une migration spécifique

# rails < 5.0
rake db:migrate:down VERSION=20100905201547

# rails >= 5.0
rake db:migrate:down VERSION=20100905201547
# or
rails db:migrate:down VERSION=20100905201547
Deepak Mahakale
la source
14

Pour annuler la dernière migration, vous pouvez effectuer:

rake db:rollback

Si vous souhaitez annuler une migration spécifique avec une version, vous devez:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Si le fichier de migration que vous souhaitez annuler a été appelé db/migrate/20141201122027_create_some_table.rb, alors la VERSION de cette migration est 20141201122027, qui est l'horodatage du moment où cette migration a été créée, et la commande pour annuler cette migration serait:

rake db:migrate:down VERSION=20141201122027
Sandip Vavhal
la source
6

S'il s'agit d'une migration réversible et de la dernière qui a été exécutée, exécutez-la rake db:rollback. Et vous pouvez toujours utiliser la version. par exemple

le fichier de migration est 20140716084539_create_customer_stats.rb, donc la commande de restauration sera, rake db:migrate:down VERSION=20140716084539

Santanu
la source
6

Pour restaurer toutes les migrations jusqu'à une version particulière (par exemple 20181002222222), utilisez:

rake db:migrate VERSION=20181002222222

(Notez que cela utilise db:migrate- pas db:migrate:downcomme dans les autres réponses à cette question.)

En supposant que la version de migration spécifiée est plus ancienne que la version actuelle, cela annulera toutes les migrations jusqu'à, mais sans inclure, la version spécifiée.

Par exemple, si rake db:migrate:statuss'affiche initialement:

  (... some older migrations ...)
  up      20181001002039  Some migration description
  up      20181002222222  Some migration description
  up      20181003171932  Some migration description
  up      20181004211151  Some migration description
  up      20181005151403  Some migration description

Fonctionnement:

rake db:migrate VERSION=20181002222222

Aura pour résultat:

  (... some older migrations ...)
  up      20181001002039  Some migration description
  up      20181002222222  Some migration description
  down    20181003171932  Some migration description
  down    20181004211151  Some migration description
  down    20181005151403  Some migration description

Référence: https://makandracards.com/makandra/845-migrate-or-revert-only-some-migrations

Jon Schneider
la source
4

Du guide Rails

Annulation des migrations précédentes

Vous pouvez utiliser la capacité d'Active Record pour annuler les migrations à l'aide de la revertméthode:

require_relative '20100905201547_create_blocks'

class FixupCreateBlock < ActiveRecord::Migration
  def change
    revert CreateBlock

    create_table(:apples) do |t|
      t.string :variety
    end
  end
end

La revertméthode accepte également un bloc d'instructions à inverser. Cela peut être utile pour rétablir certaines parties des migrations précédentes. Par exemple, imaginons que CreateBlock est validé et il est décidé ultérieurement qu'il serait préférable d'utiliser les validations Active Record, au lieu de la contrainte CHECK, pour vérifier le code postal.

    class DontUseConstraintForZipcodeValidationMigration < ActiveRecord::Migration
      def change
        revert do
          # copy-pasted code from CreateBlock
          reversible do |dir|
            dir.up do
              # add a CHECK constraint
              execute <<-SQL
                ALTER TABLE distributors
                  ADD CONSTRAINT zipchk
                    CHECK (char_length(zipcode) = 5);
              SQL
            end
            dir.down do
              execute <<-SQL
                ALTER TABLE distributors
                  DROP CONSTRAINT zipchk
              SQL
            end
          end

          # The rest of the migration was ok
        end
      end
    end

La même migration aurait également pu être écrite sans utiliser Revert, mais cela aurait impliqué quelques étapes supplémentaires: inverser l'ordre de create_table et réversible, remplacer create_table par drop_table et enfin remplacer up par down et vice-versa. Tout cela est pris en charge par Revert.

Manish Shrivastava
la source
3

Les migrations modifient l'état de la base de données à l'aide de la commande

$ bundle exec rake db:migrate

Nous pouvons annuler une seule étape de migration en utilisant

  $ bundle exec rake db:rollback

Pour remonter au début, nous pouvons utiliser

  $ bundle exec rake db:migrate VERSION=0

Comme vous pouvez le deviner, la substitution de tout autre numéro à 0 migre vers ce numéro de version, où les numéros de version proviennent de la liste séquentielle des migrations

Nirupa
la source
2

Eh bien dans les rails 5, il est assez facile de ratisser db: migrate: status ou rails db: migrate: status

Il a été modifié pour gérer les deux de la même manière. Ensuite, choisissez simplement la version que vous souhaitez restaurer, puis exécutez rake db: migrate VERSION = 2013424230423

Assurez-vous que VERSION est entièrement en majuscules

Si vous avez un problème avec une étape de la migration ou bloqué au milieu, allez simplement dans le fichier de migration et commentez les lignes qui ont déjà été migrées.

J'espère que cela pourra aider

Shahin
la source
1
Je souligne le conseil pour la commande rake db: migrate: status . . . C'est génial pour la vue d'ensemble de voir l'état d'exécution actuel des fichiers de migration.
Beauty
1

Si vous souhaitez annuler et migrer, vous pouvez exécuter:

rake db:migrate:redo

C'est la même chose que:

rake db:rollback
rake db:migrate
Iwan B.
la source