Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Migrations

Eu preciso criar migrations para ambiente de prod/dev que estou usando o banco de dados postgres. Preciso também criar migrations para o ambiente de test onde estou usando o banco h2.

Preciso de criar migrations diferentes pois a sintaxe dos bancos são diferentes.

eu configuro a de prod/dev no src/main/resources/db/migration eu configuro a de test no src/test/resources/db/migration

Estou apontando para o caminho certo, o application.properties do dev/prod estão conseguindo apontar para as migrations certas e o application-test.properties também está apontando para o caminho correto. O problema é que quando vou subir os testes, isso acontece:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Found more than one migration with version 1 Offenders: -> D:\Trabalho\Carreira\Carreira\java Projects\clinicaapi\target\classes\db\migration\V1__Create_Table_User.sql (SQL) -> D:\Trabalho\Carreira\Carreira\java Projects\clinicaapi\target\test-classes\db\migration\V1__Create_Table_Userrrrrrrrrrrrrrrrrrrrrrrrrrr.sql (SQL)

Está mostrando que está encontrando 2 migrations com a mesma versão, mas 1 quero apontar para um ambiente e a outra para o outro.

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeEsse acima está em src/main/resources e o arquivo que está aberto é o application.properties ! O de baixo estará em src/test/resources e o arquivo que estará aberto será o application-test.properties

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

6 respostas

Oi!

O Flyway, por padrão, procura migrações em ambos os diretórios src/main/resources e src/test/resources, e isso é o que está causando o conflito. Uma possível solução para isso seria usar um prefixo diferente para as migrações de teste.

Por exemplo, você poderia usar TV1__ para as migrações de teste e V1__ para as migrações de produção/desenvolvimento. Dessa forma, o Flyway não consideraria as migrações de teste como conflitantes com as migrações de produção/desenvolvimento.

No seu arquivo application-test.properties, você precisaria adicionar a seguinte linha para informar ao Flyway para procurar migrações de teste com o prefixo T:

flyway.sql-migration-prefix=T

Coloquei todos com o seguinte padrão: TV1__Create_Table_User.sql ....

Adicionei a linha de comando que me recomendou : Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Mas não mudou nada, é como se o arquivo não existisse, não está sendo reconhecido, e a seguinte mensagem aparece:

10 SQL migrations were detected but not run because they did not follow the filename convention.

solução!

Na verdade volte os nomes das migrations para o anterior e apenas adicione essa propriedade no application-test.properties:

spring.flyway.locations=filesystem:src/test/resources/db/migration

Remova a outra propriedade do prefixo

Agora funcionou, mas engraçado, continua apontando pro mesmo lugar que spring flyway.locations=classpath:db/migration. Qual a diferença? lembrando que classpath:db/migration aponta pro msm lugar mas escrito de uma forma diferente

Colocando classpath:db/migration ele vai procurar apenas dentro de src/main/resources, ignorando o source folder de testes.

Achei que esse classpath se referenciasse ao diretorio atual, que no caso seria, src/test/resources. pois o application-test.properties está dentro desse classpath (src/test/resources) -> db -> migration , por isso classpath:db/migration

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software