SQL CON SEQUELIZE: CÓMO EJECUTAR CONSULTAS Y TRABAJAR CON DATOS

Sequelize es una de las herramientas más sólidas y maduras para interactuar con bases de datos relacionales. Permitiendo escribir código orientado a objetos en lugar de SQL, manteniendo la flexibilidad y el poder de las bases de datos como PostgreSQL, MySQL, MariaDB, SQLite, SQL Server.

¿Qué es Sequelize?

Sequelize es un Object-Relational Mapping, más conocido como ORM promise-based para NodeJS y TypeScript. Facilita mapear tablas de bases de datos a clases de JavaScript/TypeScript (modelos), manejar relaciones, validaciones, migraciones y transacciones de forma elegante. Sequelize transforma la forma de interactúat con bases de datos en NodeJS, permitiendo el enfoque en la lógica de negocio en lugar de escribir SQL repetitivoa.

Ventajas principales

  • Soporte multiplataforma de bases de datos.
  • Relaciones (1:1, 1:N, N:M) con eager/lazy loading.
  • Migraciones y seeds.
  • Transacciones robustas.
  • Hooks (beforeCreate, afterUpdate, etc.).
  • Querying avanzado y raw queries cuando es necesario.

Instalación y configuración básica

  1. Crear un proyecto NodeJS e instalar las dependencias:

    mkdir mi-app-sequelize && cd mi-app-sequelize
    npm init -y
    npm install sequelize
    # Driver según tu base de datos
    npm install pg     # PostgreSQL
    # npm install mysql2    # MySQL / MariaDB
    # npm install sqlite3   # SQLite
    
  2. Configuración de la conexión ("config/database.js" o similar):

    const { Sequelize } = require('sequelize');
    
    const sequelize = new Sequelize({
      dialect: 'postgres', // o 'mysql', 'mariadb', 'sqlite', etc.
      host: process.env.DB_HOST || 'localhost',
      port: process.env.DB_PORT,
      username: process.env.DB_USER,
      password: process.env.DB_PASSWORD,
      database: process.env.DB_NAME,
      logging: process.env.NODE_ENV === 'development' ? console.log : false,
      pool: {
        max: 10,
        min: 0,
        acquire: 30000,
        idle: 10000
      }
    });
    
    module.exports = sequelize;
    

Definir Modelos

Los modelos son el corazón de Sequelize.

// models/User.js
const { Model, DataTypes } = require('sequelize');

module.exports = (sequelize) => {
  class User extends Model {}
  
  User.init({
    id: {
 type: DataTypes.INTEGER,
 primaryKey: true,
 autoIncrement: true
    },
    firstName: {
 type: DataTypes.STRING,
 allowNull: false,
 validate: { len: [2, 50] }
    },
    email: {
 type: DataTypes.STRING,
 allowNull: false,
 unique: true,
 validate: { isEmail: true }
    },
    age: {
 type: DataTypes.INTEGER,
 validate: { min: 0 }
    }
  }, {
    sequelize,
    modelName: 'User',
    timestamps: true // createdAt y updatedAt automáticos
  });

  return User;
};

Relaciones

// En el archivo de inicialización de modelos
const User = require('./models/User')(sequelize);
const Post = require('./models/Post')(sequelize);

User.hasMany(Post, { foreignKey: 'authorId', as: 'posts' });
Post.belongsTo(User, { foreignKey: 'authorId', as: 'author' });

Operaciones CRUD

// Crear
const user = await User.create({
  firstName: 'Juan',
  email: 'juan@ejemplo.com',
  age: 30
});

// Leer
const users = await User.findAll({
  include: [{ model: Post, as: 'posts' }]
});

const oneUser = await User.findByPk(1);

// Actualizar
await user.update({ age: 31 });

// Eliminar
await user.destroy();

Migraciones con Sequelize CLI

npm install -g sequelize-cli
sequelize init
Esto genera las carpetas:
  • config
  • migrations
  • models
  • seeders
Las migraciones aseguran que el esquema de tu base de datos esté versionado y sea reproducible.

Pros y Contras de Sequelize

Pros

  • Muy maduro y con gran comunidad.
  • Excelente documentación.
  • Abstracción potente sin perder control.
  • Ideal para aplicaciones empresariales.

Contras

  • No es tan fácil de aprender especialmente con asociaciones complejas.
  • Puede generar queries menos óptimas si no se entiende bien el querying.
  • añade un costo extra innecesario cuando el proyecto es muy básico.

Alternativas de Sequelize

  • Prisma: Más moderno, excelente DX y type-safety.
  • Drizzle ORM: Ligero, tipo-safe y con gran rendimiento.
  • TypeORM: Similar a Sequelize.
  • Kysely: Permite construir consultas SQL usando código JavaScript.
  • Sequelize sigue siendo una excelente elección cuando necesitas compatibilidad amplia con bases de datos legacy o un ORM full-featured con migraciones integradas.