web-dev-qa-db-fra.com

Comment annuler une migration spécifique?

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

Comment puis-je restaurer spécifiquement ce fichier de migration?

742
AnApprentice
rake db:rollback STEP=1

C'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.

Par exemple:

rake db:rollback STEP=5

Annulera également toute la migration effectuée ultérieurement (4, 3, 2 et 1).

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

rake db:migrate VERSION=20100905201547

Pour annuler une seule migration spécifique (HORS COMMANDE), utilisez:

rake db:migrate:down VERSION=20100905201547

Notez que cela n'annulera PAS les migrations intercédant - uniquement celle répertoriée. Si ce n'est pas ce que vous vouliez, vous pouvez exécuter en toute sécurité rake db:migrate et il n'exécutera à nouveau que celui-ci, en ignorant tous ceux qui n'ont pas déjà été annulés.

1192
Zachary Wright
rake db:migrate:down VERSION=20100905201547

va restaurer le fichier spécifique.


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

rake db:migrate:status

Ou simplement, le préfixe du nom de fichier de la migration est la version à restaurer.


Voir le Ruby sur Rails entrée du guide sur les migrations.

840
John Creamer

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

rake db:rollback

Si vous souhaitez annuler une migration spécifique avec une version, procédez comme suit:

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.

51
Waleed

Vous pouvez annuler votre migration en utilisant rake db:rollback avec diffé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 voulez annuler le nombre de migrations à la fois, vous passez simplement un argument:

rake db:rollback STEP=n

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

Si vous souhaitez revenir à une migration spécifique, vous devez alors 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.

26
uma

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 répertoire Rails_root/db/migrate. Recherchez le fichier approprié que vous souhaitez restaurer et copiez le numéro de préfixe.

par exemple

nom du fichier: 20140208031131_create_roles.rb alors la version est 20140208031131

24
Hardik

Annulation de la dernière migration:

# Rails < 5.0
rake db:rollback

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

Annulation de la dernière n nombre 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
14
Deepak Mahakale

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

rake db:rollback

Si vous souhaitez annuler une migration spécifique avec une version, procédez comme suit:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Si le fichier de migration que vous souhaitez annuler s'appelle db/migrate/20141201122027_create_some_table.rb, la VERSION de cette migration est 20141201122027, qui correspond à l'horodatage de la création de cette migration, et la commande permettant d'annuler cette migration est la suivante: :

rake db:migrate:down VERSION=20141201122027
13
Sandip Vavhal

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

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

6
Santanu

De Guide Rails

Annulation des migrations précédentes

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

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 méthode revert accepte également un bloc d'instructions à inverser. Cela pourrait être utile pour rétablir des parties sélectionnées des migrations précédentes. Par exemple, imaginons que CreateBlock soit validé et qu'il soit décidé par la suite qu'il serait préférable d'utiliser les validations Active Record, à la place 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é plusieurs étapes supplémentaires: inverser l'ordre de create_table et reversible, remplacer create_table par drop_table et enfin remplacer par down et inversement. Tout cela est pris en charge par Revert.

4
Manish Shrivastava

Les migrations changent 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 revenir au début, nous pouvons utiliser

  $ bundle exec rake db:migrate VERSION=0

Comme vous pouvez le deviner, substituer un autre nombre à 0 migre vers ce numéro de version, les numéros de version provenant de la liste séquentielle des migrations.

3
Nirupa

Eh bien dans Rails 5 c'est assez facile rake db: migrate: status ou Rails db: migrate: status

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

Assurez-vous que VERSION est en majuscule

Si vous rencontrez un problème avec une étape de la migration ou si vous êtes bloqué au milieu, accédez simplement au fichier de migration et commentez les lignes qui ont déjà été migrées.

J'espère que ça t'as aidé

2
Shahin

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

rake db:migrate VERSION=20181002222222

(Notez que ceci utilise db:migrate - pas db:migrate:down comme dans d'autres réponses à cette question.)

En supposant que la version de migration spécifiée soit antérieure à la version actuelle, cela annulera toutes les migrations jusqu'à la version spécifiée, sans l'inclure.

Par exemple, si rake db:migrate:status s'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

2
Jon Schneider

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
1
Iwan B.