1001Ferramentas
🦊 Geradores

Gerador de Sequelize model a partir de tabela

Gera um model Sequelize (JS) com sequelize.define, colunas e timestamps — a partir do nome da tabela.

Models Sequelize: associations, migrations e validações

O Sequelize é o ORM JavaScript pioneiro para Node.js, criado por Sascha Depold em 2011 — anos antes do TypeScript virar mainstream e bem antes do Prisma existir. Usa uma API assíncrona baseada em Promises sobre classes ES6 e suporta uma ampla lista de dialetos SQL: PostgreSQL, MySQL, MariaDB, SQLite, MSSQL, Snowflake e DB2. A maturidade é seu maior trunfo — mais de uma década em produção — enquanto a API imperativa e um pouco verbosa é a contrapartida que empurrou projetos novos para Prisma ou Drizzle.

Este gerador monta um sequelize.define inicial; o restante deste guia cobre a sintaxe completa de definição de modelos, associations, migrations com sequelize-cli, hooks, validações, transações e como o Sequelize se compara a TypeORM e Prisma em 2026.

Definindo um model

const { DataTypes } = require('sequelize');

const User = sequelize.define('User', {
  id: {
    type: DataTypes.UUID,
    defaultValue: DataTypes.UUIDV4,
    primaryKey: true,
  },
  name: { type: DataTypes.STRING, allowNull: false },
  email: {
    type: DataTypes.STRING,
    unique: true,
    validate: { isEmail: true },
  },
}, {
  timestamps: true,
  paranoid: true, // soft delete via deletedAt
});

Tipos comuns: STRING, TEXT, INTEGER, BIGINT, FLOAT, DECIMAL, BOOLEAN, DATE, UUID, JSON, JSONB (Postgres), ENUM, ARRAY. Opções no nível da coluna: allowNull, unique, defaultValue, primaryKey, autoIncrement, field (mapeia para outro nome de coluna), references (foreign key).

Associations e eager loading

O Sequelize representa relacionamentos com quatro helpers: hasOne, hasMany, belongsTo e belongsToMany. Declare depois de definir cada model:

User.hasMany(Post, { foreignKey: 'userId' });
Post.belongsTo(User, { foreignKey: 'userId' });
Article.belongsToMany(Tag, { through: 'ArticleTags' });

// Eager loading — evita N+1
const users = await User.findAll({
  include: [{ model: Post, where: { published: true } }],
});

A opção include gera um JOIN; sem ela, acessar user.posts exige uma query separada e dispara o clássico problema N+1.

Migrations, hooks, transações

Migrations são gerenciadas pelo sequelize-cli: rode npx sequelize-cli migration:generate --name add-user-email para gerar um arquivo com up() e down(); npx sequelize-cli db:migrate aplica as pendentes. Hooks (lifecycle) permitem interceptar eventos: beforeCreate, afterUpdate, beforeDestroy e outros — úteis para hash de senhas, emissão de eventos ou audit logging. Validações ficam em cada coluna: isEmail, len: [min, max], isAlpha, isUrl, mais uma função validate(value) custom que joga exceção em entrada inválida. Transações têm dois sabores: managed (commit automático no sucesso, rollback automático se você der throw) e unmanaged (você chama t.commit() / t.rollback() manualmente).

v6 vs v7, NestJS, comparações

  • Sequelize v7 (2024) entregou um rewrite TypeScript-first com decorators melhorados e tipagens mais estritas, enquanto a v6 segue muito usada em apps legados.
  • Integração com NestJS: @nestjs/sequelize oferece injeção de models por módulo, análoga ao @nestjs/typeorm.
  • vs TypeORM: Sequelize usa classes ES6 e sequelize.define; TypeORM usa decorators. A API do Sequelize é mais antiga e verbosa, mas estável.
  • vs Prisma: Sequelize é imperativo (modelos definidos em código); Prisma é declarativo (um schema .prisma gera um client tipado). Prisma vence em DX e type safety; Sequelize vence em variedade de dialetos e flexibilidade bruta.
  • Queries raw: quando o ORM atrapalha, caia para sequelize.query('SELECT ...', { type: QueryTypes.SELECT }).
  • Pool de conexões: já vem embutido — configure com pool: { max, min, idle } no construtor do Sequelize.

FAQ

Sequelize é melhor que Prisma? Nenhum é universalmente melhor. Prisma tem DX mais afiada e inferência de tipos completa; Sequelize tem suporte a mais dialetos (Snowflake, DB2) e ecossistema maduro de plugins. Para greenfield TypeScript, Prisma; para SQL legado ou poliglota, Sequelize.

Posso rodar SQL bruto? Sim — sequelize.query() aceita qualquer string SQL e retorna os resultados no formato que você especificar. Útil para window functions, CTEs ou sintaxes específicas do vendor que o ORM não modela.

Transações managed dão rollback ao throw? Sim. Envolva o trabalho em await sequelize.transaction(async (t) => { ... }) e qualquer exceção dentro do callback dispara rollback automático.

O que é o modo paranoid? Definir paranoid: true no model adiciona uma coluna deletedAt e faz destroy() virar soft delete; queries filtram os registros removidos por padrão, e paranoid: false em uma query específica os traz de volta.

Ferramentas Relacionadas