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
lastName
del usuario conemail: '[email protected]'
aWilliams
. - Elimina el usuario con
email: '[email protected]'
.
Ejercicio 3: Relaciones entre Modelos
- Crea un nuevo
Post
para un usuario existente. - Lee todos los
Post
de 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