Prisma per la gestione dei dati (e un po' di magia)

Introduzione a Prisma per semplificare la gestione dei dati ✨

Prisma è lo strumento magico per gestire i database con Node.js senza strapparti i capelli! 🧙‍♂️ Dimentica gli ORM di un'altra epoca dove ogni query ti dava il mal di testa. Prisma è veloce, semplice e adatto agli sviluppatori moderni. In questo articolo, scopriremo perché Prisma diventerà il tuo migliore amico (se non lo è già 😉), e come accoppiarlo con Zod per una validazione dei dati coi fiocchi.

Perché Prisma? 🤔

In poche parole: Prisma è fatto per semplificarti la vita. Ecco cosa rende Prisma speciale:

  • Tipizzazione automatica 🎉: Tipi TypeScript generati automaticamente per un codice solido come una roccia.
  • Performance ottimizzate 🚀: Prisma si assicura che le tue query siano efficienti. Finiti i database affaticati!
  • Semplicità 😎: Una sintassi chiara e concisa che ti fa venir voglia di scrivere query!

Installazione di Prisma con pnpm 🛠️

Pronto per l'avventura Prisma? Andiamo! Per installarlo, inizia con questi comandi:

bash
1# Inizializza un progetto Node.js se non è già fatto
2pnpm init -y
3
4# Installa Prisma CLI
5pnpm add prisma --save-dev
6
7# Inizializza Prisma nel tuo progetto
8pnpm prisma init

Questo genererà una cartella prisma con un file schema.prisma e un file .env per la configurazione del database.

Configurazione di Prisma per PostgreSQL 🐘

Prima di poter utilizzare Prisma con PostgreSQL, hai bisogno di un database PostgreSQL accessibile. Una volta che il tuo database PostgreSQL è pronto, aggiungi il suo URL di connessione nel file .env creato da Prisma. Per esempio:

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

Sostituisci USER, PASSWORD, localhost, 5432 e mio_database con le tue informazioni di connessione PostgreSQL. Prisma userà questo URL per connettersi al tuo database.

Poi, nel file schema.prisma, assicurati che il provider del database sia configurato correttamente su 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}

Ed ecco fatto! Prisma è ora configurato per connettersi a PostgreSQL. 🎉

Definire modelli con Prisma: l'esempio del blog 📝

Immaginiamo di creare un blog (classico, ma efficace) con utenti (User) e pubblicazioni (Post). Ecco come appare uno schema Prisma in 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}

Semplice, vero? Prisma ti permette di dichiarare modelli come User e Post che gestiscono le relazioni e tutto ciò che serve perché tutto funzioni senza intoppi. 👌

Migrazione del database: la magia continua ✨

Una volta che il tuo schema è pronto, è tempo di trasformarlo in tabelle nel tuo database. Questo è ciò che chiamiamo una migrazione. Per lanciare la tua prima migrazione, esegui questo comando:

bash
1# Crea e applica una migrazione
2pnpm prisma migrate dev --name init

Ed ecco fatto, il tuo database è configurato! Prisma ha fatto tutto il lavoro dietro le quinte, come un vero assistente dei dati. 🧙‍♀️

Prisma Client: Il genio che esegue le tue query 💡

Prisma Client è un ORM potente che ti permette di manipolare i tuoi dati facilmente. Ecco alcuni esempi per illustrare:

Creare un utente

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();

Leggere i dati

Vuoi vedere tutte le pubblicazioni? Ecco come fare:

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

Aggiornare una pubblicazione

Una pubblicazione in modalità bozza? Nessun problema, la pubblichiamo in un batter d'occhio:

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); // Pubblica il post con ID 1

Eliminare un utente 😢

Un'azione triste, ma a volte necessaria. Ecco come eliminare un utente e tutte le sue pubblicazioni associate:

typescript
1async function deleteUser(userId: number) {
2 await prisma.user.delete({
3 where: { id: userId },
4 });
5 console.log(`Utente con ID ${userId} è stato eliminato`);
6}
7
8deleteUser(1); // Elimina l'utente con ID 1

Parte avanzata: Validazione dei dati con Zod 🛡️

Prisma gestisce la struttura dei tuoi dati, ma che dire della validazione? È qui che entra in scena Zod! Immagina uno strato di sicurezza aggiuntivo che si assicura che i dati siano corretti prima ancora di registrarli nel database. È questo che fa Zod, con stile ed efficacia! 🎩

Integrazione di Zod: aggiungere una validazione impeccabile ⚔️

Per utilizzare Zod con Prisma, installalo nel tuo progetto.

bash
1pnpm add zod

Definire schemi Zod per la validazione

Prendiamo un esempio di validazione per la creazione di un utente. Definiremo uno schema Zod per assicurarci che i dati siano corretti prima di passarli a Prisma.

typescript
1import { z } from 'zod';
2
3// Schema di validazione per User
4const userSchema = z.object({
5 name: z.string().min(1, 'Il nome è richiesto'),
6 email: z.string().email('Email non valida'),
7});

Validazione dei dati prima dell'inserimento

Prima di creare un utente con Prisma, validiamo i dati con Zod. Se sono conformi, vengono inviati a Prisma. Altrimenti, viene restituito un errore di validazione (e non c'è modo di aggirarlo!).

typescript
1import { PrismaClient } from '@prisma/client';
2import { z } from 'zod';
3
4const prisma = new PrismaClient();
5
6async function createUser(data: unknown) {
7 // Validazione dei dati con Zod
8 const parsedData = userSchema.safeParse(data);
9 if (!parsedData.success) {
10 console.error(parsedData.error);
11 return;
12 }
13
14 // Se la validazione ha successo, creazione dell'utente
15 const user = await prisma.user.create({
16 data: parsedData.data,
17 });
18 console.log(user);
19}
20
21// Esempio di chiamata della funzione
22createUser({ name: 'Bob', email: 'bob@example.com' });

Validazione avanzata con relazioni (e più divertimento 🤹‍♂️)

Zod funziona anche per i dati complessi. Per esempio, per creare un Post, verifichiamo che l'authorId esista e sia valido:

typescript
1// Schema di validazione per Post
2const postSchema = z.object({
3 title: z.string().min(1, 'Il titolo è richiesto'),
4 content: z.string().optional(),
5 authorId: z
6 .number()
7 .int()
8 .positive('authorId deve essere un intero positivo'),
9});
10
11async function createPost(data: unknown) {
12 // Validazione dei dati
13 const parsedData = postSchema.safeParse(data);
14 if (!parsedData.success) {
15 console.error(parsedData.error);
16 return;
17 }
18
19 // Se la validazione ha successo, creazione della pubblicazione
20 const post = await prisma.post.create({
21 data: parsedData.data,
22 });
23 console.log(post);
24}
25
26// Esempio di chiamata della funzione
27createPost({ title: 'Introduzione a Prisma', authorId: 1 });

Conclusione 🏁

Con Prisma, gestire i database diventa un gioco da ragazzi (e un vero piacere!) 🎉. Aggiungendo Zod, aggiungi uno strato di validazione potente che rende il tuo codice ancora più robusto e sicuro. Che tu stia sviluppando un'applicazione complessa o un progetto personale, questa combinazione ti offre una gestione dei dati affidabile, veloce e senza problemi. Allora, pronto ad aggiungere Prisma e Zod alla tua cassetta degli attrezzi? 🛠️

Condividi questo articolo


Sébastien Timoner

Sébastien TIMONER

Lead Developer
Esperto in Sviluppo su Misura
Aix-en-Provence, France

Esperto nello sviluppo web e nella gestione di team tecnici, mi specializzo nella creazione e ottimizzazione di soluzioni digitali performanti. Grazie a una profonda padronanza di tecnologie moderne come React.js, Node.js, TypeScript e Symfony, garantisco il successo di progetti SaaS complessi, dalla progettazione alla messa in produzione, per aziende di diversi settori, all'interno di offroadLabs.

In offroadLabs, offro servizi di sviluppo su misura, combinando competenza tecnica e approccio collaborativo. Che si tratti di creare una soluzione SaaS innovativa, modernizzare un'applicazione esistente o accompagnare la crescita professionale di un team, mi impegno a fornire soluzioni robuste e performanti, adattate alle esigenze specifiche di ogni progetto.

Sono disponibile per incarichi intorno ad Aix-en-Provence o in full remote.