Skip to content

Reading & Writing Databases for Strapi.

Se trata de configurar Strapi V5 para utilizar dos bases de datos diferentes: una para lectura y otra para escritura. Esto permite tener una separación clara entre las operaciones de consulta y modificación en la base de datos.

Configuración General

  1. config/middlewares.ts
  2. config/database.ts
  3. src/middlewares/databaseRouter.ts

Configuración de la base de datos

En config/database.ts, se ha cambiado el host para permitir escribir tablas al inicio del proyecto:

...
host: env('DATABASE_HOST_WRITING', 'localhost'),
...

Esta configuración permite que Strapi escriba tablas al inicio del proyecto en la base de datos de escritura.

Configuración del Router de Base de Datos.

En src/middlewares/databaseRouter.ts, se ha creado un middleware personalizado para manejar las conexiones a la base de datos:

import { Next, Context } from 'koa'
import mysql from 'mysql2/promise'
import { env } from 'process'
export default (config, { strapi }) => {
return async ( ctx: Context, next: Next ) => {
// Configuración de la pool para lecturas
const poolRead = mysql.createPool({
host: process.env.DATABASE_HOST_READING,
port: parseInt(process.env.DATABASE_PORT),
database: process.env.DATABASE_NAME,
user: process.env.DATABASE_USERNAME,
password: process.env.DATABASE_PASSWORD,
})
// Configuración de la pool para escrituras
const poolWrite = mysql.createPool({
host: process.env.DATABASE_HOST_WRITING,
port: parseInt(process.env.DATABASE_PORT),
database: process.env.DATABASE_NAME,
user: process.env.DATABASE_USERNAME,
password: process.env.DATABASE_PASSWORD,
})
const isWriteOperation = ['POST', 'PUT', 'DELETE'].includes(ctx.method)
console.log('**********');
ctx.dbConfig = isWriteOperation ? poolWrite : poolRead
console.log(`Operación: ${ctx.method} - Base de datos: ${isWriteOperation ? 'Escritura (DATABASE_HOST2)' : 'Lectura (DATABASE_HOST1)'}`);
await next()
}
}

Este middleware personalizado realiza lo siguiente:

  1. Crea dos pools de conexión: uno para lectura y otro para escritura.
  2. Determina si la operación es una escritura basándose en el método HTTP.
  3. Asigna la pool correspondiente dependiendo del contexto del middleware.

Funcionamiento

Cuando una solicitud llega al servidor Strapi, este middleware se ejecuta primero. Dependiendo del método de la solicitud (GET, POST, PUT, DELETE), se selecciona el pool de conexión adecuado.

Para operaciones de lectura (GET):

  • Se utiliza poolRead para realizar consultas a la base de datos de lectura.

Para operaciones de escritura (POST, PUT, DELETE):

  • Se utiliza poolWrite para realizar modificaciones en la base de datos de escritura.