Checando a execução das migrations

Marciel Miranda
SIEDOS
Published in
3 min readMay 29, 2020

Já bateu aquela dúvida se sua migration realmente foi executada após um deploy automático?

Vamos a seguinte situação, em um dia comum, você aciona o deploy automático, tão confiante quanto o nascer do sol que nunca falha, contínua seu dia de forma normal e tranquila até ser questionado se determinada migration foi executada ou não. O que fazer nesse exato momento nobre guerreiro? Bom, esperto que és, já deve ter pensado em diversas formas de solucionar esse problema, o que é ótimo! Mas vamos abordar mais algumas, só para termos um repertório farto de soluções.

Então vamos lá! mãos a obra!

O Comando

rake db:migrate:status RAILS_ENV=environment

OBS: environment é onde você deseja saber se a migration rodou. Seja development, production ou staging (ou qualquer outro environment configurado)

O que esse comando faz?

Retorna todas as referências das migrations que existem no projeto em questão.

O comando tem como saída os seguintes campos: STATUS, MIGRATION ID, MIGRATION NAME, nos quais:

  • STATUS é a referência ao status atual da migration, sendo UP para migrations já executadas e DOWN para migrations pendentes.
  • MIGRATION ID é a referência do uuid da migration.
  • MIGRATION NAME é o nome da migration.

Sobre o campo MIGRATION NAME temos uma informação importante, além do nome da migration esse campo pode trazer o valor *** NO FILE *** *, isso significa que a migration foi executa, e seu uuid se encontra na tabela
schema_migrations porém o arquivo não se encontra na pasta db/migrate/.

Como o comando funciona?

Ele basicamente pega todos os uuid salvos na tabela schema_migrations e verifica se os mesmos existem na pasta db/migrate. Caso exista na tabela schema_migrations e na pasta db/migrate então quer dizer que esse migration estará UP ou seja, já executado. Caso não exista na tabela schema_migrations e exista na pasta db/migrate então esse migration estará DOWN, ou seja, não foi executado. E caso exista um uuid na tabela schema_migrations que não exista dentro da pasta db/migrate, então esse migration estará UP porém no MIGRATION NAME será mostrado como
* * * * NO FILE * * * *.

Como saber se um determinado migration foi executado?

Suponhamos que você tenha a seguinte migration:

20190625124530_add_fieldname_to_tablename.rb

Existem duas formas de saber se ela foi executada, a primeira é você ir lá no seu SGBD e executar a select a seguir:

SELECT * FROM *DEFAULT*.SCHEMA_MIGRATIONS WHERE VERSION = 20190625124530

OBS: *DEFAULT* na sql acima, simboliza o schema que a tabela schema_migrations se encontra, caso a tabela schema_migrations se encontre no schema USER então você deve informar USER.SCHEMA_MIGRATIONS.

Caso a SQL retorne resultado, então sua migration foi executada, caso não retorne nada, então ela está pendente.

A segunda maneira é a By Rails =~)

Abra o terminal, navegue até a pasta do projeto e execute:

rake db:migrate:status | grep 20190625124530 RAILS_ENV=environment

Agora basta analisar se a primeira palavra do retorno é UP ou DOWN.

UP 20190625124530 Add Fieldname To Tablename

OBS: Caso esse comando não retorne resultado, você provavelmente copiou o uuid errado, ou então essa migration não existe nem no banco nem na pasta db/migrate

--

--