Múltiples bases de datos con prisma
Conocimientos Previos Requeridos
Antes de implementar una arquitectura con múltiples bases de datos, es altamente recomendable tener bases sólidas en:
- Modelado Relacional: Entender cómo estructurar tablas y relaciones (uno a uno, uno a muchos, muchos a muchos).
- Prisma Client: Saber ejecutar operaciones CRUD básicas (Create, Read, Update, Delete) usando el cliente autogenerado.
- Variables de Entorno (
.env): Comprender cómo aislar y proteger las cadenas de conexión a las bases de datos. - TypeScript: Familiaridad con el tipado estricto para aprovechar al máximo el autocompletado que genera Prisma.
¿Dónde aprenderlo?
- En YouTube (Español): Canales como Fazt (busca "Prisma Crash Course Fazt") tienen tutoriales directos y prácticos para dominar lo esencial.
- Documentación Oficial: La sección Quickstart en la documentación de Prisma es tu mejor herramienta para consultar la sintaxis exacta de los esquemas.
Estructura de Directorios
Para mantener tus configuraciones aisladas y el código generado donde no estorbe, usaremos esta arquitectura:
tu-proyecto/
├── prisma/
│ ├── database-1/
│ │ ├── schema.prisma
│ │ └── prisma.config.ts
│ └── database-2/
│ ├── schema.prisma
│ └── prisma.config.ts
├── src/
│ ├── generated/
│ │ ├── database-1/ <-- Cliente generado 1
│ │ └── database-2/ <-- Cliente generado 2
│ └── db.ts <-- Archivo centralizado de conexión
├── .env
└── package.json
Guía Paso a Paso
1. Definir las Variables de Entorno
Añade las conexiones a tu archivo .env en la raíz del proyecto:
DATABASE_1_URL="postgresql://usuario:password@localhost:5432/bd1"
DATABASE_2_URL="mysql://usuario:password@localhost:3306/bd2"
2. Configurar la Base de Datos 1
Dentro de prisma/database-1/, crea tus dos archivos. Observa cómo la URL ya no está en el schema.
prisma/database-1/schema.prisma
generator client {
provider = "prisma-client"
output = "../../src/generated/database-1"
compilerBuild = "fast"
}
datasource db {
provider = "postgresql"
}
model User {
id Int @id @default(autoincrement())
name String
email String @unique
}
prisma/database-1/prisma.config.ts
import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: "schema.prisma",
datasource: {
url: env("DATABASE_1_URL"),
},
});
3. Configurar la Base de Datos 2
Haz lo mismo en la carpeta database-2, apuntando a su respectiva variable de entorno y modificando el output.
prisma/database-2/schema.prisma
generator client {
provider = "prisma-client"
output = "../../src/generated/database-2"
compilerBuild = "fast"
}
datasource db {
provider = "mysql"
}
model Product {
id Int @id @default(autoincrement())
title String
price Float
}
prisma/database-2/prisma.config.ts
import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: "schema.prisma",
datasource: {
url: env("DATABASE_2_URL"),
},
});
4. Automatizar la Generación
Para que no tengas que entrar manualmente a cada carpeta cada vez que hagas un cambio en tus modelos, agrega estos scripts en tu package.json:
"scripts": {
"generate:db1": "cd prisma/database-1 && npx prisma generate",
"generate:db2": "cd prisma/database-2 && npx prisma generate",
"generate:all": "npm run generate:db1 && npm run generate:db2"
}
Al ejecutar npm run generate:all, Prisma procesará ambas carpetas y arrojará los tipos y el cliente directo a tu src/generated/.
5. Centralizar las Conexiones
Para usar ambas bases de datos sin conflictos en tu lógica de negocio, crea un archivo que actúe como punto de entrada único.
src/db.ts
import { PrismaClient as ClientDB1 } from "./generated/database-1";
import { PrismaClient as ClientDB2 } from "./generated/database-2";
// Instanciamos ambas bases de datos
export const db1 = new ClientDB1();
export const db2 = new ClientDB2();
Ahora, desde cualquier parte de tu código, puedes interactuar con ambas de forma limpia y tipada:
import { db1, db2 } from "./db";
async function main() {
const users = await db1.user.findMany();
const products = await db2.product.findMany();
console.log({ users, products });
}
Gracias por leer.