Sequelize es un ORM para Nodejs que te permite agilizar el desarrollo de aplicaciones que incluyen la conexión con bases de datos relacionales como Postgres, MySQL, MariaDB, SQLite y SQL Server.
De MySQL Community Downloads, descargue e instale:
Desde la línea de comandos, en la raíz de la carpeta del proyecto.
Instale Sequelize CLI de forma global, con:
npm install -g sequelize-cli
Instale Sequelize y el conector para MySQL para el proyecto, con:
npm install --save sequelize mysql2
Genere los archivos de configuración de Sequelize, con:
sequelize init
config/config.json
contiene la configuración para la conexión con la base de datos relacional.models
contendrá las clases correspondientes a las entidades de la base de datos relacional.migrations
contendrá los scripts a ejecutar en la base de datos relacional y en la aplicación. Estos scripts actúan como registros históricos de los cambios.seeders
contendrá los scripts para generar datos para las entidades de la base datos relacional.
Modifique el archivo config/config.json
con los datos para la conexión con el motor de bases de datos. En este caso, el ambiente a utilizar es development.
{
"development": {
"username": "root",
"password": "root",
"database": "album",
"host": "127.0.0.1",
"dialect": "mysql"
},
...
El modelo es una representación abstracta, mediante clases (atributos y métodos), de las entidades de la base de datos relacional.
Desde la línea de comandos, en la raíz de la carpeta del proyecto.
Cree el modelo foto
, con:
sequelize model:create --name foto --attributes titulo:string,descripcion:string,calificacion:float,ruta:string
models
se agregó la clase foto.js, con la configuración predeterminada para la clase foto con los atributos especificados.migrations
se agregó el script YYYYMMDDHHMMSS-create-foto.js para crear la tabla en la base de datos.
Las migraciones contienen un registro histórico de los cambios realizados en los modelos y/o entidades.
Desde la línea de comandos, en la raíz de la carpeta del proyecto.
Ejecute TODAS las migraciones, con:
sequelize db:migrate
A veces, es necesario generar datos de manera automática.
Desde la línea de comandos, en la raíz de la carpeta del proyecto.
sequelize seed:generate --name fotos
seeders/YYYYMMDDHHMMSS-fotos.js
,
...
async up (queryInterface, Sequelize) {
for (let i = 0; i <10; i++) {
await queryInterface.bulkInsert('fotos', [{
titulo: 'fotos'+i,
descripcion: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
calificacion: (Math.random()*10).toFixed(2),
ruta: 'public/images/'+'fotos'+i+'.png',
createdAt: new Date(),
updatedAt: new Date()
}], {});
}
},
...
...
async down (queryInterface, Sequelize) {
await queryInterface.bulkDelete('fotos', null, {});
},
...
sequelize db:seed --seed YYYYMMDDHHMMSS-fotos
sequelize db:seed:all
sequelize db:seed:undo:all
Revise los cambios en la base de datos.
Para solicitar los datos desde la base de datos, será necesario que:
var express = require('express');
var router = express.Router();
module.exports = router;
var express = require('express');
var router = express.Router();
const Sequelize = require('sequelize');
const Foto = require('../models').foto;
module.exports = router;
"/findAll/json"
. El cual, responde con todas las fotos (findAll) que se encuentran en la tabla renderizados en un json.
...
const Foto = require('../models').foto;
router.get('/findAll/json', function(req, res, next) {
Foto.findAll({
attributes: { exclude: ["updatedAt"] }
})
.then(fotos => {
res.json(fotos);
})
.catch(error => res.status(400).send(error))
});
module.exports = router;
"/findAll/view"
. El cual, responde con todas las fotos (findAll) que se encuentran en la tabla renderizados en la vista html.
...
router.get('/findAll/view', function(req, res, next) {
Foto.findAll({
attributes: { exclude: ["updatedAt"] }
})
.then(fotos => {
res.render('fotos', { title: 'Fotos', arrFotos: fotos });
})
.catch(error => res.status(400).send(error))
});
module.exports = router;
<!DOCTYPE html>
<html>
<head>
<title><%= title %></title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
</head>
<body>
...
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/feather-icons@4.28.0/dist/feather.min.js" integrity="sha384-uO3SXW5IuS1ZpFPKugNNWqTZRRglnUJK6UAZ/gxOX80nxEkN9NcGZTftn6RzhGWE" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.4/dist/Chart.min.js" integrity="sha384-zNy6FEbO50N+Cg5wap8IKA4M/ZnLJgzc6w2NqACZaK0u0FXfOWRRJOnQtpZun8ha" crossorigin="anonymous"></script>
</body>
</html>
...
<div class="container-fluid p-4">
<h1 class="pb-4"><%= title %></h1>
<table class="table table-striped table-hover">
<thead>
<tr>
<th>Id</th>
<th>Título</th>
<th>Descripción</th>
<th>Ruta</th>
<th>Fecha de creación</th>
</tr>
</thead>
<tbody>
<% arrFotos.forEach((foto) => { %>
<tr>
<td><%= foto.id %></td>
<td><%= foto.titulo %></td>
<td><%= foto.descripcion %></td>
<td><%= foto.ruta %></td>
<td><%= foto.createdAt.toLocaleDateString('en-US') %></td>
</tr>
<% }); %>
</tbody>
</table>
</div>
...
...
var fotosRouter = require('./routes/fotos');
...
...
app.use('/fotos', fotosRouter);
...
http://localhost:3000/fotos/findAll/json
http://localhost:3000/fotos/findAll/view