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.prismadonde se definen los modelos. - Un
.envpara 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.