Saltar al contenido principal

Prisma ORM

Prisma es un ORM (Object-Relational Mapper) moderno para Node.js y TypeScript que facilita trabajar con bases de datos relacionales como MySQL, PostgreSQL, SQLite y SQL Server. Prisma permite definir modelos de datos de manera declarativa y proporciona una API tipo objeto para realizar operaciones CRUD, relaciones y consultas complejas sin escribir SQL manualmente.

Ventajas de Prisma:

  • No requiere escribir SQL directamente; proporciona una API tipo objeto.
  • Compatible con tipado estático, ideal para TypeScript.
  • Facilita la gestión de relaciones entre tablas.
  • Genera migraciones automáticas y mantiene sincronización con la base de datos.
  • Mejora la legibilidad, seguridad y mantenibilidad del código.

Instalación

npm install @prisma/client
npm install prisma --save-dev

Luego inicializamos Prisma en el proyecto:

npx prisma init

Esto crea:

  • Un archivo prisma/schema.prisma donde se definen los modelos.
  • Un .env para la configuración de la base de datos.

Configuración de la base de datos

Ejemplo de configuración schema.prisma para MySQL:

schema.prisma
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
}

generator client {
provider = "prisma-client-js"
}

model Usuario {
id Int @id @default(autoincrement())
nombre String
email String @unique
}

En un fichero .env debemos indicar los datos de acceso a nuestra base de datos MySQL:

.env
DATABASE_URL="mysql://usuario:clave@localhost:3306/miBD"

Luego generamos el cliente de Prisma:

npx prisma generate

Uso de Prisma Client

import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

Crear un registro

const usuario = await prisma.usuario.create({
data: {
nombre: 'Ana',
email: 'ana@example.com'
}
});

console.log('Usuario creado con ID:', usuario.id);

Leer registros

// Obtener todos los usuarios
const usuarios = await prisma.usuario.findMany();
usuarios.forEach(u => console.log(u.id, u.nombre, u.email));

// Obtener un usuario por ID
const usuario1 = await prisma.usuario.findUnique({
where: { id: 1 }
});
console.log(usuario1);

Actualizar registros

const actualizado = await prisma.usuario.update({
where: { id: 2 },
data: { email: 'nuevo_email@example.com' }
});
console.log('Usuario actualizado:', actualizado);

Eliminar registros

const eliminado = await prisma.usuario.delete({
where: { id: 3 }
});
console.log('Usuario eliminado:', eliminado);

Consultas avanzadas

// Filtrar usuarios cuyo nombre contenga "a"
const usuariosFiltrados = await prisma.usuario.findMany({
where: { nombre: { contains: 'a' } },
orderBy: { nombre: 'asc' },
take: 5
});
console.log(usuariosFiltrados);

Buenas prácticas

  • Usar prisma.$disconnect() al finalizar la aplicación para cerrar la conexión.
  • Manejar errores con try/catch.
  • Usar transacciones (prisma.$transaction) para operaciones críticas.
  • Mantener el esquema de Prisma actualizado y versionado con migraciones.