Introducción
Sequelize es un ORM (Object-Relational Mapping) para Node.js que facilita la interacción con bases de datos SQL como MySQL, PostgreSQL, SQLite y MSSQL. Sequelize permite definir modelos que representan tablas en la base de datos y proporciona métodos para realizar operaciones CRUD (Crear, Leer, Actualizar, Eliminar) de manera sencilla.
Contenido
Instalación de Sequelize
Para comenzar a usar Sequelize, primero necesitamos instalar Sequelize y el paquete del cliente de la base de datos que vamos a utilizar. En este ejemplo, usaremos PostgreSQL.
Configuración de Sequelize
Después de instalar Sequelize, necesitamos configurarlo para conectarnos a nuestra base de datos. Creamos un archivo config/database.js para manejar la configuración.
const { Sequelize } = require('sequelize');
// Configuración de la conexión a la base de datos
const sequelize = new Sequelize('database_name', 'username', 'password', {
host: 'localhost',
dialect: 'postgres', // Puede ser 'mysql', 'sqlite', 'mssql', etc.
});
module.exports = sequelize;Definición de Modelos
Los modelos en Sequelize representan tablas en la base de datos. Vamos a definir un modelo User como ejemplo.
const { DataTypes } = require('sequelize');
const sequelize = require('./config/database');
// Definición del modelo User
const User = sequelize.define('User', {
// Definición de atributos
firstName: {
type: DataTypes.STRING,
allowNull: false,
},
lastName: {
type: DataTypes.STRING,
allowNull: false,
},
email: {
type: DataTypes.STRING,
allowNull: false,
unique: true,
},
}, {
// Opciones del modelo
timestamps: true,
});
module.exports = User;Operaciones CRUD
Crear
Para crear un nuevo registro en la tabla User, usamos el método create.
const User = require('./models/User');
async function createUser() {
try {
const user = await User.create({
firstName: 'John',
lastName: 'Doe',
email: '[email protected]',
});
console.log('User created:', user.toJSON());
} catch (error) {
console.error('Error creating user:', error);
}
}
createUser();Leer
Para leer registros de la tabla User, usamos el método findAll o findOne.
async function getUsers() {
try {
const users = await User.findAll();
console.log('All users:', JSON.stringify(users, null, 2));
} catch (error) {
console.error('Error fetching users:', error);
}
}
getUsers();Actualizar
Para actualizar un registro, usamos el método update.
async function updateUser(id) {
try {
const result = await User.update({ lastName: 'Smith' }, {
where: { id: id }
});
console.log('Number of affected rows:', result[0]);
} catch (error) {
console.error('Error updating user:', error);
}
}
updateUser(1);Eliminar
Para eliminar un registro, usamos el método destroy.
async function deleteUser(id) {
try {
const result = await User.destroy({
where: { id: id }
});
console.log('Number of deleted rows:', result);
} catch (error) {
console.error('Error deleting user:', error);
}
}
deleteUser(1);Relaciones entre Modelos
Sequelize permite definir relaciones entre modelos, como uno a muchos, muchos a muchos, etc. Vamos a definir una relación uno a muchos entre User y Post.
const Post = sequelize.define('Post', {
title: {
type: DataTypes.STRING,
allowNull: false,
},
content: {
type: DataTypes.TEXT,
allowNull: false,
},
});
// Definición de la relación
User.hasMany(Post, { foreignKey: 'userId' });
Post.belongsTo(User, { foreignKey: 'userId' });
module.exports = { User, Post };Ejercicios Prácticos
Ejercicio 1: Crear y Leer Usuarios
- Crea un nuevo usuario con los datos
firstName: 'Alice', lastName: 'Johnson', email: '[email protected]'. - Lee todos los usuarios y muestra los resultados en la consola.
Ejercicio 2: Actualizar y Eliminar Usuarios
- Actualiza el
lastNamedel usuario conemail: '[email protected]'aWilliams. - Elimina el usuario con
email: '[email protected]'.
Ejercicio 3: Relaciones entre Modelos
- Crea un nuevo
Postpara un usuario existente. - Lee todos los
Postde un usuario específico y muestra los resultados en la consola.
Soluciones
Solución Ejercicio 1
async function exercise1() {
try {
// Crear usuario
const user = await User.create({
firstName: 'Alice',
lastName: 'Johnson',
email: '[email protected]',
});
console.log('User created:', user.toJSON());
// Leer usuarios
const users = await User.findAll();
console.log('All users:', JSON.stringify(users, null, 2));
} catch (error) {
console.error('Error in exercise 1:', error);
}
}
exercise1();Solución Ejercicio 2
async function exercise2() {
try {
// Actualizar usuario
const result = await User.update({ lastName: 'Williams' }, {
where: { email: '[email protected]' }
});
console.log('Number of affected rows:', result[0]);
// Eliminar usuario
const deleteResult = await User.destroy({
where: { email: '[email protected]' }
});
console.log('Number of deleted rows:', deleteResult);
} catch (error) {
console.error('Error in exercise 2:', error);
}
}
exercise2();Solución Ejercicio 3
async function exercise3() {
try {
// Crear post
const user = await User.findOne({ where: { email: '[email protected]' } });
const post = await Post.create({
title: 'My First Post',
content: 'This is the content of my first post.',
userId: user.id,
});
console.log('Post created:', post.toJSON());
// Leer posts de un usuario
const posts = await Post.findAll({ where: { userId: user.id } });
console.log('All posts for user:', JSON.stringify(posts, null, 2));
} catch (error) {
console.error('Error in exercise 3:', error);
}
}
exercise3();Conclusión
En esta sección, hemos aprendido a usar Sequelize para interactuar con bases de datos SQL en Node.js. Hemos cubierto la instalación y configuración de Sequelize, la definición de modelos, y cómo realizar operaciones CRUD. También hemos explorado cómo definir relaciones entre modelos y hemos practicado con ejercicios prácticos. Con estos conocimientos, estás preparado para manejar bases de datos SQL en tus aplicaciones Node.js de manera eficiente.
Curso de Node.js
Módulo 1: Introducción a Node.js
Módulo 2: Conceptos Básicos
Módulo 3: Sistema de Archivos y E/S
Módulo 4: HTTP y Servidores Web
- Creando un Servidor HTTP Simple
- Manejo de Solicitudes y Respuestas
- Sirviendo Archivos Estáticos
- Enrutamiento
Módulo 5: NPM y Gestión de Paquetes
- Introducción a NPM
- Instalación y Uso de Paquetes
- Creación y Publicación de Paquetes
- Versionado Semántico
Módulo 6: Framework Express.js
- Introducción a Express.js
- Configuración de una Aplicación Express
- Middleware
- Enrutamiento en Express
- Manejo de Errores
Módulo 7: Bases de Datos y ORMs
- Introducción a las Bases de Datos
- Usando MongoDB con Mongoose
- Usando Bases de Datos SQL con Sequelize
- Operaciones CRUD
Módulo 8: Autenticación y Autorización
- Introducción a la Autenticación
- Usando Passport.js
- Autenticación JWT
- Control de Acceso Basado en Roles
Módulo 9: Pruebas y Depuración
- Introducción a las Pruebas
- Pruebas Unitarias con Mocha y Chai
- Pruebas de Integración
- Depuración de Aplicaciones Node.js
Módulo 10: Temas Avanzados
- Módulo Cluster
- Hilos de Trabajo
- Optimización del Rendimiento
- Construcción de APIs RESTful
- GraphQL con Node.js
Módulo 11: Despliegue y DevOps
- Variables de Entorno
- Usando PM2 para la Gestión de Procesos
- Desplegando en Heroku
- Integración y Despliegue Continuos
