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.
- Relaciones (1:1, 1:N, N:M) con eager/lazy loading.
Instalación y configuración básica
- 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 - 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
- config
- migrations
- models
- seeders
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.