¿Cómo deshacer una migración específica?

808

Tengo el siguiente archivo de migración db\migrate\20100905201547_create_blocks.rb

¿Cómo puedo deshacer específicamente ese archivo de migración?

Un aprendiz
fuente
1
¿Esto soluciona el problema? Solo tendrá que hacer Class.down stackoverflow.com/questions/753919/run-a-single-migration-file
danivovich el
44
Toda la información sobre migraciones aquí
Nishutosh Sharma
1
¿Desea revertir solo esa migración específica única (incluso si hay migraciones más recientes que vienen después)? ¿O desea revertir la base de datos al estado en que se encontraba antes de que se aplicara esa migración y cualquier migración posterior?
Jon Schneider

Respuestas:

1342
rake db:rollback STEP=1

Es una forma de hacerlo, si la migración que desea revertir es la última aplicada. Puede sustituir 1 por la cantidad de migraciones que desee volver.

Por ejemplo:

rake db:rollback STEP=5

También revertirá toda la migración que ocurrió más tarde (4, 3, 2 y también 1).

Para revertir todas las migraciones (e incluir) una migración de destino, use: (Este comando corregido se agregó DESPUÉS de todos los comentarios que señalan el error en la publicación original)

rake db:migrate VERSION=20100905201547

Para revertir SOLO UNA migración específica (FUERA DE PEDIDO) use:

rake db:migrate:down VERSION=20100905201547

Tenga en cuenta que esto NO revertirá las migraciones intercesoras, solo la listada. Si eso no es lo que pretendía, puede ejecutarlo de manera segura rake db:migratey volverá a ejecutar solo ese, omitiendo cualquier otro que no haya sido revertido anteriormente.

Y si alguna vez desea migrar una única migración fuera de servicio, también existe su inverso db:migrate:up:

rake db:migrate:up VERSION=20100905201547
Zachary Wright
fuente
14
"Para revertir a una versión específica": ¿el comando que sigue no revierte una migración específica, en lugar de retroceder a esa versión?
Andrew Grimm
10
"Para retroceder a una versión específica, use ..." ¡ Esta respuesta es incorrecta! Esto revertirá la migración de forma aislada como se explica en otras respuestas.
Rhys van der Waerden
3
ADVERTENCIA: Cometí este error: solo use rake db: migrate: down VERSION = 20100905201547 para retroceder EN AISLAMIENTO !!! Un archivo de migración. Esto se menciona en el comentario anterior, pero lo extrañé.
pixelearth
3
Otra palabra de advertencia: nunca lo hagas STEP=-1. Lo hice una vez y se volvió loco, haciendo retroceder todo. ¡No está bien! Esto era Rails 4.2. Supongo que puede estar solucionado por ahora.
Dave Hartnoll
1
Escribí un artículo en mi blog sobre migraciones, que explica cómo y cuándo usar estos comandos: railsguides.net/polish-rails-migrations
ka8725
868
rake db:migrate:down VERSION=20100905201547

revertirá el archivo específico.


Para encontrar la versión de todas las migraciones, puede usar este comando:

rake db:migrate:status

O, simplemente, el prefijo del nombre del archivo de la migración es la versión que necesita revertir.


Consulte la entrada de la guía Ruby on Rails sobre migraciones.

John Creamer
fuente
48
Definitivamente la respuesta preferida en mi opinión.
streetlogics
30
Vale la pena mencionar que si revierte una migración específica y no desea que vuelva a migrar en las próximas tareas de rake, elimine también el archivo de migración.
BradGreens
44
Nota: parece que si la migración ascendente nunca tuvo éxito, sino que solo se ejecutó parcialmente, la disminución no hace nada.
cyrilchampier
1
@nerith, probablemente sea cierto solo para bases de datos que no admiten DDL transaccional. MySQL no soporta transaccional DDL: dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html PostreSQL hace: wiki.postgresql.org/wiki/... Así que si su migración sobre la base de datos MySQL se rompe entonces tiene que eliminar manualmente parte de la migración que tuvo éxito.
Иван Бишевац
1
Otra observación con respecto al comentario de @BradGreens. Si desea eliminar el archivo de migración, y ya se ha implementado, querrá revertir la producción / puesta en escena antes de confirmar el código con el archivo eliminado. De lo contrario, no podrá revertir / migrar: abajo.
AdamT
57

Para revertir la última migración, puede hacer:

rake db:rollback

Si desea revertir una migración específica con una versión, debe hacer lo siguiente:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Por ejemplo, si la versión es 20141201122027, hará:

rake db:migrate:down VERSION=20141201122027

para revertir esa migración específica.

Waleed
fuente
32

Puede revertir su migración utilizando rake db:rollbackdiferentes opciones. La sintaxis será diferente según sus requisitos.

Si desea deshacer solo la última migración, puede usar cualquiera

rake db:rollback

o

rake db:rollback STEP=1

Si desea revertir el número de migraciones a la vez, simplemente pase un argumento:

rake db:rollback STEP=n

donde nes el número de migraciones para revertir, contando desde la última migración.

Si desea revertir a una migración específica, debe pasar la versión de la migración de la siguiente manera:

rake db:migrate:down VERSION=xxxxx

donde xxxxx es el número de versión de la migración.

uma
fuente
1
agregando: down no funciona, la respuesta correcta es sin down
Elta3lab
26

rake db:migrate:down VERSION=your_migrations's_version_number_here

La versión es el prefijo numérico del nombre del archivo de la migración.

Cómo encontrar la versión :

Sus archivos de migración se almacenan en su rails_root/db/migratedirectorio. Encuentre el archivo apropiado hasta el que desea revertir y copie el número de prefijo.

por ejemplo

nombre del archivo: 20140208031131_create_roles.rb entonces la versión es20140208031131

Hardik
fuente
66
La forma más sencilla de encontrar la identificación de migración es ejecutarrake db:migrate:status
Aeradriel,
18

Revertir la última migración:

# rails < 5.0
rake db:rollback

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

Revertir el último nnúmero de migraciones

# rails < 5.0
rake db:rollback STEP=2

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

Revertir una migración específica

# 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
fuente
14

Para revertir la última migración, puede hacer:

rake db:rollback

Si desea revertir una migración específica con una versión, debe hacer lo siguiente:

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

Si se llamó al archivo de migración que desea revertir db/migrate/20141201122027_create_some_table.rb, entonces la VERSIÓN para esa migración es 20141201122027, que es la marca de tiempo de cuándo se creó esa migración, y el comando para revertir esa migración sería:

rake db:migrate:down VERSION=20141201122027
Sandip Vavhal
fuente
6

Si es una migración reversible y la última que se ha ejecutado, ejecute rake db:rollback. Y siempre puedes usar la versión. p.ej

el archivo de migración es 20140716084539_create_customer_stats.rb, por lo que el comando de reversión será, rake db:migrate:down VERSION=20140716084539

Santanu
fuente
6

Para revertir todas las migraciones a una versión particular (por ejemplo 20181002222222), use:

rake db:migrate VERSION=20181002222222

(Tenga en cuenta que esto usa db:migrate, no db:migrate:downcomo en otras respuestas a esta pregunta).

Suponiendo que la versión de migración especificada es anterior a la versión actual, esto revertirá todas las migraciones hasta, pero sin incluir, la versión especificada.

Por ejemplo, si rake db:migrate:statusinicialmente muestra:

  (... 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

Corriendo:

rake db:migrate VERSION=20181002222222

Resultará en:

  (... 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

Referencia: https://makandracards.com/makandra/845-migrate-or-revert-only-some-migrations

Jon Schneider
fuente
4

De la guía de rieles

Revertir migraciones anteriores

Puede usar la capacidad de Active Record para revertir las migraciones utilizando el revertmétodo:

require_relative '20100905201547_create_blocks'

class FixupCreateBlock < ActiveRecord::Migration
  def change
    revert CreateBlock

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

El revertmétodo también acepta un bloque de instrucciones para revertir. Esto podría ser útil para revertir partes seleccionadas de migraciones anteriores. Por ejemplo, imaginemos que CreateBlock está comprometido y luego se decide que sería mejor usar validaciones de registro activo, en lugar de la restricción CHECK, para verificar el código 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 misma migración también podría haberse escrito sin usar revertir, pero esto habría implicado algunos pasos más: invertir el orden de create_table y reversible, reemplazar create_table por drop_table y finalmente reemplazar up por down y viceversa. Todo esto se soluciona mediante revertir.

Shrivastava Manish
fuente
3

Las migraciones cambian el estado de la base de datos con el comando

$ bundle exec rake db:migrate

Podemos deshacer un solo paso de migración usando

  $ bundle exec rake db:rollback

Para volver al principio, podemos usar

  $ bundle exec rake db:migrate VERSION=0

Como puede adivinar, la sustitución de cualquier otro número por 0 migra a ese número de versión, donde los números de versión provienen de enumerar las migraciones secuencialmente

Nirupa
fuente
2

Bueno, en rails 5 es bastante fácil rake db: migrate: status o rails db: migrate: status

Se modificó para manejar ambos de la misma manera. Luego simplemente elija la versión que desea revertir y luego ejecute rake db: migrate VERSION = 2013424230423

Asegúrate de que la VERSIÓN sea mayúscula

Si tiene un problema con algún paso de la migración o está atascado en el medio, simplemente vaya al archivo de migración y comente las líneas que ya se migraron.

Espero que ayude

Shahin
fuente
1
Destaco la sugerencia para el comando rake db: migrate: status . . . Es genial para la visión general ver el estado actual de ejecución de los archivos de migración.
Belleza el
1

Si desea revertir y migrar puede ejecutar:

rake db:migrate:redo

Eso es lo mismo que:

rake db:rollback
rake db:migrate
Iwan B.
fuente