3
respostas

Como saber se eu já migrei mudanças feitas no modelo para o banco?

Vamos supor que eu fiz algumas alterações nos campos do modelo adicionando algumas propriedade, e fiz algumas migrações, como saber se todas as migrações somadas são um espelho do meu modelo? E se eu esquecer de fazer alguma migração para sincronizar o banco com o modelo? Por exemplo no campo "nome" eu fiz adições posteriormente para colocar validação e agora não lembro se fiz a migração e se o banco e o modelo estão sincronizados. Isso foi um exemplo mas pode ter outros campos que eu não me lembro se fiz. Outro exemplo pode ser o campo "role" que eu migrei quando tinha disponível somente as opções "estudante" e "docente", mas depois eu adicionei "admin". Se eu pegar um projeto já pronto como vou saber se o banco e o modelo estão sincronizados? Não tem um jeito automático de saber? Eu vou ter que olhar campo por campo de cada modelo(seja pessoa, curso, etc) e cada migração de cada modelo para ver se estão sincronizados?

3 respostas

Olá Luidi! Joia?

Aqui estão algumas dicas que podem te ajudar a verificar se suas migrações estão atualizadas em relação aos modelos:

  1. Histórico de Migrações: O Sequelize mantém um registro das migrações aplicadas no banco de dados. Você pode verificar a tabela de migrações no seu banco (geralmente chamada de SequelizeMeta) para ver quais migrações já foram aplicadas. Isso pode te dar uma ideia de quais mudanças já foram incorporadas.

  2. Comando de Sincronização: O Sequelize oferece o método sequelize.sync() que pode ser usado para sincronizar seus modelos com o banco de dados. No entanto, é importante ter cuidado ao usar esse método em ambientes de produção, pois ele pode alterar o esquema do banco de dados diretamente. Em desenvolvimento, ele pode ser útil para garantir que o banco de dados esteja alinhado com os modelos.

  3. Ferramentas de Comparação de Esquema: Existem ferramentas externas que podem ajudar a comparar o esquema atual do banco de dados com os modelos definidos no código. Elas podem gerar um relatório das diferenças, o que pode ser útil para identificar mudanças que ainda não foram migradas.

  4. Práticas de Desenvolvimento: Para evitar essa confusão no futuro, é uma boa prática criar uma nova migração sempre que fizer alterações nos modelos. Isso ajuda a garantir que cada mudança seja documentada e aplicada de forma consistente.

Infelizmente, não há uma maneira completamente automática de garantir que tudo está sincronizado sem algum nível de verificação manual, mas essas práticas podem ajudar a minimizar o trabalho envolvido.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

1)Como eu poderia usar o "sequelize.sync()"? Colocar dentro de um método? Pode me mostrar? E como eu faço essa separação de ambientes? No caso seria o ambiente de desenvolvimento sempre usaria esse método e o de produção nunca? Se puder mostre um exemplo tbm.

2)Qual ferramenta usar para comparação de esquemas? Essa ferramenta mostraria a diferença entre a validação do CPF no nível da aplicação e no nível do banco? Por exemplo, na aplicação a validação está completa mas no banco apenas confere se tem 11 dígitos? E caso tenha essa diferença e eu queira implementar mais validações no CPF no nível do banco eu teria que criar uma nova migração copiando a migração já feita(aquela que confere 11 dígitos) e adicionando novas validações? Eu apagaria a migração antiga que só conferia 11 dígitos? Se apagaria, qual o comando para apagar uma migração específica que pode estar lá atrás na fila de migrações já feitas? Se puder mostre um exemplo.

Fala, Luidi!

Vou te mostrar como usar sequelize.sync(), como separar ambientes, qual ferramenta usar para comparar esquemas, e como lidar com migrações antigas, tudo de forma objetiva.

Com base no que você explicou, faça assim:


// arquivo: sync-dev.js
const { sequelize } = require('./models');

async function syncDev() {
  // *force* recria tabelas. Evite usar em produção.
  await sequelize.sync({ alter: true });
  console.log('Banco sincronizado com o modelo (somente DEV)');
}

syncDev();

Importante:

  • Execute esse arquivo somente no ambiente de desenvolvimento.
  • No package.json, você pode separar ambientes assim:

{
  "scripts": {
    "dev": "NODE_ENV=development node sync-dev.js && node app.js",
    "start": "NODE_ENV=production node app.js"
  }
}

Ferramenta para comparar o modelo com o banco

Use a ferramenta sequelize-auto-migrations ou um db diff tool como DB Schema ou DBeaver (função compare schemas).
Ela mostra diferenças estruturais, por exemplo:

  • campo que falta
  • tipo incorreto
  • validações feitas no banco (como CHECK)

Essas ferramentas não leem validação de aplicação, ou seja, não vão comparar sua validação de CPF do código com a validação do banco.
Para isso, você mesmo precisa garantir que colocou uma constraint correspondente no banco.

Sobre validações novas (ex: CPF)
Se você quiser adicionar novas validações no nível do banco (ex: adicionar um CHECK mais completo), faça assim:

  1. Crie uma nova migração apenas com a alteração.
  2. Nunca apague migrações antigas, pois isso quebra o histórico.

Veja este exemplo de migração adicionando validação ao CPF:


// migration: 20250101120000-add-cpf-check.js
module.exports = {
  async up(queryInterface, Sequelize) {
    await queryInterface.changeColumn('Pessoas', 'cpf', {
      type: Sequelize.STRING,
      allowNull: false,
      validate: {}, // validações da aplicação não entram aqui
    });

    await queryInterface.sequelize.query(`
      ALTER TABLE Pessoas 
      ADD CONSTRAINT cpf_valid CHECK (length(cpf) = 11);
    `);
  },

  async down(queryInterface) {
    await queryInterface.sequelize.query(`
      ALTER TABLE Pessoas 
      DROP CONSTRAINT cpf_valid;
    `);
  }
};

"Como apagar uma migração já aplicada?"
Você não apaga um arquivo antigo.
Você reverte:


npx sequelize-cli db:migrate:undo

Ou para reverter várias:


npx sequelize-cli db:migrate:undo:all

Se quiser “corrigir” uma migração antiga, crie outra migração ajustando.
Isso mantém o histórico íntegro — que é o objetivo das migrações.

Fico à disposição.