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

Qual a diferença entre o "unique" do modelo e da migração?

Qual a diferença entre o "unique" do modelo e da migração? Devo colocar só na migração ou no modelo também?

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
2 respostas
solução!

Olá, Luidi! Como vai?

A diferença entre definir unique no modelo e na migração está principalmente em onde e como essa restrição é aplicada.

  1. No Modelo: Quando você define unique: true no modelo do Sequelize, está especificando que, ao criar ou atualizar registros através do Sequelize, ele deve garantir que os valores dessa coluna sejam únicos. Isso é útil para validações no nível da aplicação, antes mesmo de enviar a query ao banco de dados. No entanto, se a tabela já existir no banco sem essa restrição, apenas definir no modelo não será suficiente para garantir a unicidade no banco de dados.

    Exemplo:

    const User = sequelize.define('User', {
      username: {
        type: DataTypes.STRING,
        unique: true
      }
    });
    
  2. Na Migração: Ao definir unique na migração, você está instruindo o banco de dados a aplicar essa restrição diretamente na tabela. Isso significa que, independentemente de como os dados são inseridos ou atualizados (seja pelo Sequelize ou por outra ferramenta), o banco de dados garantirá que os valores sejam únicos.

    Exemplo de migração:

    module.exports = {
      up: async (queryInterface, Sequelize) => {
        await queryInterface.createTable('Users', {
          username: {
            type: Sequelize.STRING,
            unique: true
          }
        });
      }
    };
    

Recomendação: É uma boa prática definir a restrição de unicidade tanto no modelo quanto na migração. Isso garante que a unicidade seja validada tanto no nível da aplicação quanto no banco de dados, proporcionando uma camada extra de segurança e integridade dos dados.

Espero ter ajudado e bons estudos!

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

Se quiser uma outra resposta, ou explicação! :)

A diferença entre definir unique no modelo e na migração está no papel que cada um desempenha dentro do projeto.

No modelo (Model)

Quando eu coloco unique: true em um campo no modelo Sequelize, estou dizendo para o ORM que aquele campo deve ser único. Isso é útil principalmente para validação em nível de aplicação — ou seja, o Sequelize pode lançar um erro se eu tentar criar um registro duplicado, dependendo da forma como o código está estruturado.

Exemplo:

email: {
  type: DataTypes.STRING,
  unique: true
}

Na migração (Migration)

Já na migração, quando eu defino unique: true, estou dizendo para o banco de dados criar uma constraint de unicidade. Isso é mais robusto, porque garante que mesmo fora da aplicação, o banco não vai aceitar valores duplicados naquele campo.

Exemplo:

await queryInterface.createTable('Usuarios', {
  email: {
    type: Sequelize.STRING,
    unique: true
  }
});

Então, onde colocar?

Eu costumo colocar nos dois. No modelo, para que o Sequelize saiba da regra e possa aplicar validações. Na migração, para garantir que o banco de dados também respeite essa regra, mesmo se alguém tentar inserir dados diretamente por outro meio (como via SQL puro ou outra ferramenta).