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: 'johndoe@example.com',
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: 'janedoe@example.com',
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
Productamb els campsname,priceistock. Sincronitza el model amb la base de dades i crea alguns productes. - Associacions: Defineix una relació
many-to-manyentreUseriProductmitjanç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
