Gerador de Sequelize model a partir de tabela
Gere um model do Sequelize (JS) com colunas e timestamps a partir do nome de uma tabela. Acelere a modelagem do banco de dados no seu projeto Node.js.
—
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/sequelizeoferece 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
.prismagera 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
Gerador de Prisma model a partir de tabela
Gera um bloco model Prisma (schema.prisma) com id, name, email e timestamps — a partir do nome da tabela.
Gerador de migration Flyway a partir de tabela
Gere um arquivo de migration do Flyway (V1__create_table.sql) com CREATE TABLE a partir do nome de uma tabela. Versione o schema do seu banco em projetos Java.
Gerador de migration Knex a partir de tabela
Gere uma migration do Knex.js (createTable e dropTable) a partir do nome de uma tabela. Acelere a criação de migrações de banco de dados no seu projeto Node.js.