Prisma para la gestión de datos (y un poco de magia)

Introducción a Prisma para simplificar la gestión de datos ✨

¡Prisma es la herramienta mágica para gestionar bases de datos con Node.js sin arrancarte el pelo! 🧙‍♂️ Olvídate de los ORM de otra época donde cada consulta te daba dolor de cabeza. Prisma es rápido, simple y adaptado a los desarrolladores modernos. En este artículo, descubriremos por qué Prisma se convertirá en tu mejor amigo (si no lo es ya 😉), y cómo combinarlo con Zod para una validación de datos perfecta.

¿Por qué Prisma? 🤔

En pocas palabras: Prisma está hecho para facilitarte la vida. Esto es lo que hace especial a Prisma:

  • Tipado automático 🎉: Tipos TypeScript generados automáticamente para un código sólido como una roca.
  • Rendimiento optimizado 🚀: Prisma se asegura de que tus consultas sean eficientes. ¡Se acabaron las bases de datos cansadas!
  • Simplicidad 😎: Una sintaxis clara y concisa que te dan ganas de escribir consultas.

Instalación de Prisma con pnpm 🛠️

¿Listo para la aventura Prisma? ¡Vamos allá! Para instalarlo, comienza con estas líneas de comando:

bash
1# Inicializa un proyecto Node.js si no lo has hecho ya
2pnpm init -y
3
4# Instala Prisma CLI
5pnpm add prisma --save-dev
6
7# Inicializa Prisma en tu proyecto
8pnpm prisma init

Esto generará una carpeta prisma con un archivo schema.prisma y un archivo .env para la configuración de la base de datos.

Configuración de Prisma para PostgreSQL 🐘

Antes de poder usar Prisma con PostgreSQL, necesitas una base de datos PostgreSQL accesible. Una vez que tu base de datos PostgreSQL esté lista, añade su URL de conexión en el archivo .env creado por Prisma. Por ejemplo:

dotenv
1# .env
2DATABASE_URL="postgresql://USER:PASSWORD@localhost:5432/mi_base_de_datos?schema=public"

Reemplaza USER, PASSWORD, localhost, 5432 y mi_base_de_datos con tu información de conexión PostgreSQL. Prisma usará esta URL para conectarse a tu base de datos.

Luego, en el archivo schema.prisma, asegúrate de que el proveedor (provider) de la base de datos esté configurado correctamente para PostgreSQL:

prisma
1// schema.prisma
2generator client {
3 provider = "prisma-client-js"
4}
5
6datasource db {
7 provider = "postgresql"
8 url = env("DATABASE_URL")
9}

¡Y listo! Prisma está ahora configurado para conectarse a PostgreSQL. 🎉

Definir modelos con Prisma: el ejemplo del blog 📝

Imaginemos que estás creando un blog (clásico, pero efectivo) con usuarios (User) y publicaciones (Post). Así es como se ve un esquema Prisma en schema.prisma:

prisma
1// schema.prisma
2model User {
3 id Int @id @default(autoincrement())
4 name String
5 email String @unique
6 posts Post[]
7}
8
9model Post {
10 id Int @id @default(autoincrement())
11 title String
12 content String?
13 published Boolean @default(false)
14 author User @relation(fields: [authorId], references: [id])
15 authorId Int
16}

¿Simple, verdad? Prisma te permite declarar modelos como User y Post que gestionan las relaciones y todo lo necesario para que todo funcione sin problemas. 👌

Migración de la base de datos: la magia continúa ✨

Una vez que tu esquema está listo, es hora de transformarlo en tablas en tu base de datos. Esto es lo que llamamos una migración. Para lanzar tu primera migración, ejecuta este comando:

bash
1# Crea y aplica una migración
2pnpm prisma migrate dev --name init

¡Y listo, tu base de datos está configurada! Prisma ha hecho todo el trabajo en segundo plano, como un verdadero asistente de datos. 🧙‍♀️

Prisma Client: El genio que ejecuta tus consultas 💡

Prisma Client es un ORM potente que te permite manipular tus datos fácilmente. Aquí algunos ejemplos para ilustrar:

Crear un usuario

typescript
1import { PrismaClient } from '@prisma/client';
2const prisma = new PrismaClient();
3
4async function createUser() {
5 const user = await prisma.user.create({
6 data: {
7 name: 'Alice',
8 email: 'alice@example.com',
9 },
10 });
11 console.log(user);
12}
13
14createUser();

Leer datos

¿Quieres ver todas las publicaciones? Así es cómo se hace:

typescript
1async function getAllPosts() {
2 const posts = await prisma.post.findMany();
3 console.log(posts);
4}
5
6getAllPosts();

Actualizar una publicación

¿Una publicación en modo borrador? No hay problema, la publicamos en un abrir y cerrar de ojos:

typescript
1async function publishPost(postId: number) {
2 const post = await prisma.post.update({
3 where: { id: postId },
4 data: { published: true },
5 });
6 console.log(post);
7}
8
9publishPost(1); // Publica el post con ID 1

Eliminar un usuario 😢

Una acción triste, pero a veces necesaria. Así es cómo eliminar un usuario y todas sus publicaciones asociadas:

typescript
1async function deleteUser(userId: number) {
2 await prisma.user.delete({
3 where: { id: userId },
4 });
5 console.log(`Usuario con ID ${userId} ha sido eliminado`);
6}
7
8deleteUser(1); // Elimina el usuario con ID 1

Parte avanzada: Validación de datos con Zod 🛡️

Prisma maneja la estructura de tus datos, pero ¿qué hay de la validación? ¡Aquí es donde entra en escena Zod! Imagina una capa de seguridad adicional que asegura que los datos son correctos antes incluso de guardarlos en la base de datos. ¡Esto es lo que hace Zod, con estilo y eficacia! 🎩

Integración de Zod: añadir una validación impecable ⚔️

Para usar Zod con Prisma, instálalo en tu proyecto.

bash
1pnpm add zod

Definir esquemas Zod para la validación

Tomemos un ejemplo de validación para la creación de un usuario. Vamos a definir un esquema Zod para asegurarnos de que los datos son correctos antes de enviarlos a Prisma.

typescript
1import { z } from 'zod';
2
3// Esquema de validación para User
4const userSchema = z.object({
5 name: z.string().min(1, 'El nombre es requerido'),
6 email: z.string().email('Email inválido'),
7});

Validación de datos antes de la inserción

Antes de crear un usuario con Prisma, validamos los datos con Zod. Si son conformes, se envían a Prisma. Si no, se devuelve un error de validación (¡y no hay forma de evitarlo!).

typescript
1import { PrismaClient } from '@prisma/client';
2import { z } from 'zod';
3
4const prisma = new PrismaClient();
5
6async function createUser(data: unknown) {
7 // Validación de datos con Zod
8 const parsedData = userSchema.safeParse(data);
9 if (!parsedData.success) {
10 console.error(parsedData.error);
11 return;
12 }
13
14 // Si la validación es exitosa, creación del usuario
15 const user = await prisma.user.create({
16 data: parsedData.data,
17 });
18 console.log(user);
19}
20
21// Ejemplo de llamada a la función
22createUser({ name: 'Bob', email: 'bob@example.com' });

Validación avanzada con relaciones (y más diversión 🤹‍♂️)

Zod también funciona para datos complejos. Por ejemplo, para crear un Post, verificamos que el authorId existe y es válido:

typescript
1// Esquema de validación para Post
2const postSchema = z.object({
3 title: z.string().min(1, 'El título es requerido'),
4 content: z.string().optional(),
5 authorId: z.number().int().positive('authorId debe ser un entero positivo'),
6});
7
8async function createPost(data: unknown) {
9 // Validación de datos
10 const parsedData = postSchema.safeParse(data);
11 if (!parsedData.success) {
12 console.error(parsedData.error);
13 return;
14 }
15
16 // Si la validación es exitosa, creación de la publicación
17 const post = await prisma.post.create({
18 data: parsedData.data,
19 });
20 console.log(post);
21}
22
23// Ejemplo de llamada a la función
24createPost({ title: 'Introducción a Prisma', authorId: 1 });

Conclusión 🏁

Con Prisma, gestionar bases de datos se convierte en un juego de niños (¡y un verdadero placer!) 🎉. Al añadir Zod, agregas una capa de validación potente que hace tu código aún más robusto y seguro. Ya sea que estés desarrollando una aplicación compleja o un proyecto personal, esta combinación te proporciona una gestión de datos fiable, rápida y sin preocupaciones. Entonces, ¿listo para añadir Prisma y Zod a tu caja de herramientas? 🛠️

Comparte este artículo


Sébastien Timoner

Sébastien TIMONER

Desarrollador Líder
Experto en Desarrollo a Medida
Aix-en-Provence, France

Experto en desarrollo web y gestión de equipos técnicos, me especializo en la creación y optimización de soluciones digitales de alto rendimiento. Gracias a un profundo dominio de tecnologías modernas como React.js, Node.js, TypeScript y Symfony, garantizo el éxito de proyectos SaaS complejos, desde el diseño hasta la implementación, para empresas de diversos sectores, dentro de offroadLabs.

En offroadLabs, ofrezco servicios de desarrollo a medida, combinando experiencia técnica y enfoque colaborativo. Ya sea para crear una solución SaaS innovadora, modernizar una aplicación existente o acompañar el desarrollo de habilidades de un equipo, me comprometo a proporcionar soluciones robustas y eficientes, adaptadas a las necesidades específicas de cada proyecto.

Estoy disponible para proyectos en la zona de Aix-en-Provence o en modalidad totalmente remota.