Checando a execução das migrations
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
Referências: