Base de datos
Express.js no incluye un ORM propio, pero se integra fácilmente con distintas soluciones para manejar bases de datos, como Sequelize, Mongoose (para MongoDB) o consultas SQL directas usando paquetes como mysql2 o pg. Esto permite crear, leer, actualizar y eliminar registros de manera estructurada según el tipo de base de datos que se utilice.
Configuración de la base de datos
Para conectar una base de datos, primero se instalan los paquetes necesarios y se configuran las credenciales en variables de entorno:
DB_HOST=localhost
DB_PORT=3306
DB_USER=usuario
DB_PASSWORD=contraseña
DB_NAME=mi_base
Luego se establece la conexión, por ejemplo usando Sequelize con MySQL:
import { Sequelize } from 'sequelize';
const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASSWORD, {
host: process.env.DB_HOST,
dialect: 'mysql'
});
module.exports = sequelize;
Creación de modelos
Con Sequelize, los modelos representan tablas de la base de datos:
import { Sequelize, DataTypes, Model } from 'sequelize';
const sequelize = new Sequelize('sqlite::memory:');
const Usuario = sequelize.define('Usuario', {
nombre: { type: DataTypes.STRING, allowNull: false },
email: { type: DataTypes.STRING, allowNull: false, unique: true },
edad: { type: DataTypes.INTEGER }
});
module.exports = Usuario;
Operaciones CRUD
Se pueden realizar operaciones básicas utilizando los métodos de los modelos:
// Crear un usuario
await Usuario.create({
nombre: 'Juan',
email: 'juan@mail.com',
edad: 25
});
// Obtener todos los usuarios
const usuarios = await Usuario.findAll();
// Actualizar un usuario
await Usuario.update({ edad: 26 }, { where: { id: 1 } });
// Eliminar un usuario
await Usuario.destroy({ where: { id: 1 } });
Buenas prácticas y convenciones
- Mantener la configuración de la base de datos en variables de entorno.
- Usar un ORM o librería de consulta para centralizar la lógica de acceso a datos.
- Mantener modelos delgados, delegando la lógica compleja a servicios.
- Versionar la estructura de la base de datos con migraciones cuando sea posible.
- Definir índices y claves únicas según la naturaleza de los datos para optimizar consultas.