En aquest tema, aprendrem com connectar un servidor GraphQL a una base de dades. Això és essencial per a qualsevol aplicació que necessiti emmagatzemar i recuperar dades de manera eficient. Explorarem els conceptes bàsics de la connexió a bases de dades, utilitzant exemples pràctics amb Node.js i una base de dades SQL (PostgreSQL) i NoSQL (MongoDB).
Objectius d'aprenentatge
- Entendre com configurar una connexió a una base de dades des d'un servidor GraphQL.
- Aprendre a utilitzar llibreries populars per a la connexió a bases de dades SQL i NoSQL.
- Implementar consultes bàsiques per recuperar i modificar dades.
Requisits previs
- Coneixements bàsics de Node.js.
- Familiaritat amb els conceptes de bases de dades SQL i NoSQL.
- Haver completat els mòduls anteriors del curs.
- Configuració del projecte
Instal·lació de dependències
Primer, necessitem instal·lar les dependències necessàries. Utilitzarem pg
per a PostgreSQL i mongoose
per a MongoDB.
Configuració de PostgreSQL
- Instal·lació de PostgreSQL: Si no tens PostgreSQL instal·lat, pots descarregar-lo des de aquí.
- Creació d'una base de dades: Un cop instal·lat, crea una base de dades.
Configuració de MongoDB
- Instal·lació de MongoDB: Si no tens MongoDB instal·lat, pots descarregar-lo des de aquí.
- Creació d'una base de dades: MongoDB crea automàticament una base de dades quan s'insereix el primer document.
- Connexió a PostgreSQL
Configuració de la connexió
Crea un fitxer db.js
per gestionar la connexió a PostgreSQL.
// db.js const { Pool } = require('pg'); const pool = new Pool({ user: 'yourusername', host: 'localhost', database: 'mydatabase', password: 'yourpassword', port: 5432, }); module.exports = pool;
Exemple de consulta
Ara, podem utilitzar aquesta connexió en els nostres resolvers de GraphQL.
// resolvers.js const pool = require('./db'); const resolvers = { Query: { users: async () => { const res = await pool.query('SELECT * FROM users'); return res.rows; }, }, }; module.exports = resolvers;
- Connexió a MongoDB
Configuració de la connexió
Crea un fitxer db.js
per gestionar la connexió a MongoDB.
// db.js const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true, }); const db = mongoose.connection; db.on('error', console.error.bind(console, 'connection error:')); db.once('open', () => { console.log('Connected to MongoDB'); }); module.exports = mongoose;
Definició d'un model
Definim un model per a la col·lecció users
.
// models/User.js const mongoose = require('mongoose'); const userSchema = new mongoose.Schema({ name: String, email: String, }); const User = mongoose.model('User', userSchema); module.exports = User;
Exemple de consulta
Ara, podem utilitzar aquest model en els nostres resolvers de GraphQL.
// resolvers.js const User = require('./models/User'); const resolvers = { Query: { users: async () => { return await User.find(); }, }, }; module.exports = resolvers;
Exercicis pràctics
Exercici 1: Connexió a PostgreSQL
- Configura una connexió a PostgreSQL en un nou projecte.
- Crea una taula
products
amb les columnesid
,name
iprice
. - Implementa una consulta GraphQL per recuperar tots els productes.
Exercici 2: Connexió a MongoDB
- Configura una connexió a MongoDB en un nou projecte.
- Crea un model
Product
amb els campsname
iprice
. - Implementa una consulta GraphQL per recuperar tots els productes.
Solucions
Solució a l'Exercici 1
-- Crea la taula products CREATE TABLE products ( id SERIAL PRIMARY KEY, name VARCHAR(100), price NUMERIC );
// resolvers.js const pool = require('./db'); const resolvers = { Query: { products: async () => { const res = await pool.query('SELECT * FROM products'); return res.rows; }, }, }; module.exports = resolvers;
Solució a l'Exercici 2
// models/Product.js const mongoose = require('mongoose'); const productSchema = new mongoose.Schema({ name: String, price: Number, }); const Product = mongoose.model('Product', productSchema); module.exports = Product;
// resolvers.js const Product = require('./models/Product'); const resolvers = { Query: { products: async () => { return await Product.find(); }, }, }; module.exports = resolvers;
Conclusió
En aquesta secció, hem après com connectar un servidor GraphQL a bases de dades SQL i NoSQL. Hem vist exemples pràctics de com configurar les connexions i implementar consultes bàsiques. Aquest coneixement és fonamental per desenvolupar aplicacions GraphQL que necessiten interactuar amb bases de dades per emmagatzemar i recuperar dades. En el següent tema, explorarem estratègies de recuperació de dades per optimitzar el rendiment de les nostres aplicacions.
Curs de GraphQL
Mòdul 1: Introducció a GraphQL
- Què és GraphQL?
- GraphQL vs REST
- Configuració d'un servidor GraphQL
- Conceptes bàsics de l'esquema de GraphQL
Mòdul 2: Conceptes bàsics
Mòdul 3: Disseny avançat d'esquemes
Mòdul 4: Treballant amb dades
- Connexió a una base de dades
- Estratègies de recuperació de dades
- Agrupació i emmagatzematge en memòria cau
- Gestió d'errors
Mòdul 5: Rendiment i seguretat
Mòdul 6: Eines i ecosistema
Mòdul 7: Proves i desplegament
- Proves unitàries de resolvers
- Proves d'integració
- Integració contínua
- Desplegament de servidors GraphQL