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:

  1. Configurar Sequelize en un projecte Node.js.
  2. Definir models i associacions.
  3. Realitzar operacions CRUD (Crear, Llegir, Actualitzar, Esborrar).
  4. 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.

npm install sequelize mysql2

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

  1. Crear un Model de Producte: Defineix un model Product amb els camps name, price i stock. Sincronitza el model amb la base de dades i crea alguns productes.
  2. Associacions: Defineix una relació many-to-many entre User i Product mitjançant un model Order. Crea alguns usuaris i productes, i després crea algunes comandes.
  3. 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

Mòdul 7: Bases de Dades i ORMs

Mòdul 8: Autenticació i Autorització

Mòdul 9: Proves i Depuració

Mòdul 10: Temes Avançats

Mòdul 11: Desplegament i DevOps

Mòdul 12: Projectes del Món Real

© Copyright 2024. Tots els drets reservats