Introducció
Sequelize és un ORM (Object-Relational Mapping) per a Node.js que facilita la interacció amb bases de dades SQL com MySQL, PostgreSQL, SQLite i MSSQL. Proporciona una API basada en promeses per gestionar models, associacions, transaccions i consultes.
Objectius
En aquest tema, aprendràs a:
- Configurar Sequelize en un projecte Node.js.
- Definir models i associacions.
- Realitzar operacions CRUD (Crear, Llegir, Actualitzar, Esborrar).
- Utilitzar consultes avançades.
Configuració de Sequelize
Instal·lació
Primer, instal·lem Sequelize i el connector de la base de dades que utilitzarem. En aquest exemple, utilitzarem MySQL.
Configuració de la Connexió
Crea un fitxer config/database.js
per configurar la connexió a la base de dades.
const { Sequelize } = require('sequelize'); const sequelize = new Sequelize('database_name', 'username', 'password', { host: 'localhost', dialect: 'mysql' }); module.exports = sequelize;
Provar la Connexió
És important assegurar-se que la connexió a la base de dades funciona correctament.
const sequelize = require('./config/database'); sequelize.authenticate() .then(() => { console.log('Connexió establerta correctament.'); }) .catch(err => { console.error('No s\'ha pogut connectar a la base de dades:', err); });
Definir Models
Els models representen les taules de la base de dades. Crea un fitxer models/User.js
per definir un model d'usuari.
const { DataTypes } = require('sequelize'); const sequelize = require('../config/database'); const User = sequelize.define('User', { username: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, allowNull: false, unique: true }, password: { type: DataTypes.STRING, allowNull: false } }, { tableName: 'users' }); module.exports = User;
Sincronitzar Models
Sincronitza els models amb la base de dades per crear les taules.
const sequelize = require('./config/database'); const User = require('./models/User'); sequelize.sync({ force: true }) .then(() => { console.log('Totes les taules han estat creades.'); }) .catch(err => { console.error('Error creant les taules:', err); });
Operacions CRUD
Crear
const User = require('./models/User'); User.create({ username: 'johndoe', email: '[email protected]', password: 'password123' }).then(user => { console.log('Usuari creat:', user.toJSON()); }).catch(err => { console.error('Error creant l\'usuari:', err); });
Llegir
User.findAll().then(users => { console.log('Tots els usuaris:', users); }).catch(err => { console.error('Error obtenint els usuaris:', err); });
Actualitzar
User.update({ password: 'newpassword123' }, { where: { username: 'johndoe' } }).then(() => { console.log('Usuari actualitzat.'); }).catch(err => { console.error('Error actualitzant l\'usuari:', err); });
Esborrar
User.destroy({ where: { username: 'johndoe' } }).then(() => { console.log('Usuari esborrat.'); }).catch(err => { console.error('Error esborrant l\'usuari:', err); });
Associacions
Sequelize permet definir relacions entre models. Per exemple, un usuari pot tenir molts articles.
Definir Models
Crea un model Article
.
const { DataTypes } = require('sequelize'); const sequelize = require('../config/database'); const User = require('./User'); const Article = sequelize.define('Article', { title: { type: DataTypes.STRING, allowNull: false }, content: { type: DataTypes.TEXT, allowNull: false } }, { tableName: 'articles' }); User.hasMany(Article, { foreignKey: 'userId' }); Article.belongsTo(User, { foreignKey: 'userId' }); module.exports = Article;
Crear i Llegir amb Associacions
const User = require('./models/User'); const Article = require('./models/Article'); User.create({ username: 'janedoe', email: '[email protected]', password: 'password123', Articles: [{ title: 'Primer Article', content: 'Aquest és el contingut del primer article.' }] }, { include: [Article] }).then(user => { console.log('Usuari i article creats:', user.toJSON()); }).catch(err => { console.error('Error creant l\'usuari i l\'article:', err); }); User.findOne({ where: { username: 'janedoe' }, include: [Article] }).then(user => { console.log('Usuari amb articles:', user.toJSON()); }).catch(err => { console.error('Error obtenint l\'usuari amb articles:', err); });
Consultes Avançades
Sequelize permet realitzar consultes avançades utilitzant operadors i funcions agregades.
Operadors
const { Op } = require('sequelize'); User.findAll({ where: { email: { [Op.like]: '%example.com' } } }).then(users => { console.log('Usuaris amb correus electrònics que contenen "example.com":', users); }).catch(err => { console.error('Error obtenint els usuaris:', err); });
Funcions Agregades
User.findAll({ attributes: [ [sequelize.fn('COUNT', sequelize.col('id')), 'userCount'] ] }).then(result => { console.log('Nombre total d\'usuaris:', result[0].get('userCount')); }).catch(err => { console.error('Error obtenint el nombre total d\'usuaris:', err); });
Exercicis Pràctics
- Crear un Model de Producte: Defineix un model
Product
amb els campsname
,price
istock
. Sincronitza el model amb la base de dades i crea alguns productes. - Associacions: Defineix una relació
many-to-many
entreUser
iProduct
mitjançant un modelOrder
. Crea alguns usuaris i productes, i després crea algunes comandes. - Consultes Avançades: Realitza una consulta per obtenir tots els usuaris que han comprat un producte específic.
Conclusió
En aquest tema, hem après a configurar Sequelize en un projecte Node.js, definir models i associacions, realitzar operacions CRUD i utilitzar consultes avançades. Sequelize és una eina poderosa que simplifica la interacció amb bases de dades SQL, permetent-nos centrar-nos en la lògica de l'aplicació en lloc de les complexitats de les consultes SQL.
Curs de Node.js
Mòdul 1: Introducció a Node.js
Mòdul 2: Conceptes Bàsics
Mòdul 3: Sistema de Fitxers i I/O
Mòdul 4: HTTP i Servidors Web
Mòdul 5: NPM i Gestió de Paquets
Mòdul 6: Framework Express.js
- Introducció a Express.js
- Configuració d'una Aplicació Express
- Middleware
- Routing en Express
- Gestió d'Errors
Mòdul 7: Bases de Dades i ORMs
- Introducció a les Bases de Dades
- Utilitzar MongoDB amb Mongoose
- Utilitzar Bases de Dades SQL amb Sequelize
- Operacions CRUD
Mòdul 8: Autenticació i Autorització
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb Mocha i Chai
- Proves d'Integració
- Depuració d'Aplicacions Node.js
Mòdul 10: Temes Avançats
Mòdul 11: Desplegament i DevOps
- Variables d'Entorn
- Utilitzar PM2 per a la Gestió de Processos
- Desplegar a Heroku
- Integració i Desplegament Continu