Black November

ATÉ 50% OFF

TÁ ACABANDO!

0 dias

0 horas

0 min

0 seg

1
resposta

Unique do modelo não funcionou.

Eu testei colocar o "Unique" no modelo e não funcionou. Só passou a funcionar quando eu fiz a migração com a "constraint" "Unique". Eu pensei que "Unique" no modelo funcionava para o nível de aplicação e a constraint para o nível do banco, mas colocando só no modelo e testando não funcionou sem a migração, pq?

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
1 resposta

Olá Luidi.
Vamos tentar entender.

  • O que acontece quando você coloca unique: true no modelo
    Quando você define algo assim no modelo:
const Usuario = sequelize.define('Usuario', {
  email: {
    type: DataTypes.STRING,
    unique: true,
  },
});

Você está declarando para o Sequelize que esse campo deve ser único.
Mas isso só tem efeito real no banco de dados se o Sequelize criar ou alterar a tabela ou seja, se houver uma sincronização (sync) ou uma migração que reflita essa configuração no schema.
Se você apenas atualiza o modelo no código, mas não recria ou altera a tabela no banco, o Sequelize não aplica automaticamente essa constraint, porque ele não altera o schema do banco de dados existente sozinho.

  • Por que funcionou apenas quando você criou a constraint na migração
    Quando você escreveu uma migração como:
await queryInterface.addConstraint('Usuarios', {
  fields: ['email'],
  type: 'unique',
  name: 'unique_email_constraint'
});

Essa migração de fato executou um comando SQL no banco, algo como:

ALTER TABLE "Usuarios" ADD CONSTRAINT "unique_email_constraint" UNIQUE ("email");

Agora, o banco está fisicamente garantindo a unicidade da coluna email.
Isso é o que realmente impede registros duplicados, independentemente da aplicação.

  • Então, o unique do modelo serve pra quê?
    O unique dentro do modelo serve principalmente para:
  • Gerar a constraint quando o Sequelize cria a tabela pela primeira vez via sequelize.sync({ force: true }) ou sequelize.sync({ alter: true }).
  • Documentar (de forma declarativa) no modelo que aquele campo deve ser único.
  • Permitir que ferramentas do Sequelize (como validações de schema) saibam que a coluna é única.

Mas se o banco já foi criado, e você não sincroniza novamente o schema, essa configuração não muda nada no banco.
Em projetos reais (principalmente em produção), sempre use migrações para criar ou alterar constraints.
Use unique: true no modelo para manter a consistência entre código e banco, mas não confie apenas nele.
Nunca use sync({ force: true }) em produção. Isso apaga tabelas.
Comente ai qualquer duvida.
Bons estudos.