Qual a diferença entre o "unique" do modelo e da migração? Devo colocar só na migração ou no modelo também?
Qual a diferença entre o "unique" do modelo e da migração? Devo colocar só na migração ou no modelo também?
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.
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
}
});
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!
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).