È uscito il Corso SQL Completo

Connessione al Database

Connection String

Prisma utilizza una connection string definita come variabile d’ambiente per connettersi al database. Ogni provider ha un formato specifico.

PostgreSQL

DATABASE_URL="postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMA"

Esempio concreto:

DATABASE_URL="postgresql://admin:secretpass@localhost:5432/myapp?schema=public"

Con parametri SSL per produzione:

DATABASE_URL="postgresql://admin:pass@db.example.com:5432/myapp?schema=public&sslmode=require"

MySQL

DATABASE_URL="mysql://USER:PASSWORD@HOST:PORT/DATABASE"
DATABASE_URL="mysql://root:password@localhost:3306/myapp"

SQLite

SQLite usa un file locale, quindi la connection string e’ un percorso:

DATABASE_URL="file:./dev.db"

SQL Server

DATABASE_URL="sqlserver://HOST:PORT;database=DATABASE;user=USER;password=PASSWORD;encrypt=true"
DATABASE_URL="sqlserver://localhost:1433;database=myapp;user=sa;password=MyPass123;encrypt=true"

MongoDB

DATABASE_URL="mongodb+srv://USER:PASSWORD@cluster.mongodb.net/DATABASE?retryWrites=true&w=majority"
DATABASE_URL="mongodb://root:password@localhost:27017/myapp?authSource=admin"

Configurazione nello Schema

datasource db {
  provider = "postgresql"  // "mysql" | "sqlite" | "sqlserver" | "mongodb"
  url      = env("DATABASE_URL")
}

Puoi anche separare l’URL diretto da quello per le connessioni dirette (utile con PgBouncer):

datasource db {
  provider  = "postgresql"
  url       = env("DATABASE_URL")
  directUrl = env("DIRECT_URL")
}

Variabili d’Ambiente

Prisma legge automaticamente il file .env nella root del progetto. Puoi usare env() nello schema per riferire qualsiasi variabile:

# .env
DATABASE_URL="postgresql://admin:pass@localhost:5432/myapp"
SHADOW_DATABASE_URL="postgresql://admin:pass@localhost:5432/myapp_shadow"

Per ambienti multipli, crea file separati:

# Sviluppo
cp .env.development .env

# Produzione (usa le variabili dell'hosting)

Pool di Connessioni

Prisma gestisce un connection pool interno. Puoi configurarlo tramite parametri nella connection string:

DATABASE_URL="postgresql://admin:pass@localhost:5432/myapp?connection_limit=10&pool_timeout=30"

Parametri disponibili:

Parametro Descrizione Default
connection_limit Numero massimo di connessioni num_cpus * 2 + 1
pool_timeout Timeout attesa connessione (secondi) 10

Configurazione Programmatica

const prisma = new PrismaClient({
  datasources: {
    db: {
      url: process.env.DATABASE_URL,
    },
  },
})

Connessione in Produzione

Piattaforme Serverless

Nelle piattaforme serverless (Vercel, AWS Lambda), ogni invocazione potrebbe creare nuove connessioni. Usa Prisma Accelerate o un connection pooler esterno:

# Con PgBouncer
DATABASE_URL="postgresql://admin:pass@pgbouncer.host:6432/myapp?pgbouncer=true"
DIRECT_URL="postgresql://admin:pass@db.host:5432/myapp"
datasource db {
  provider  = "postgresql"
  url       = env("DATABASE_URL")
  directUrl = env("DIRECT_URL")
}

Singleton Pattern

In ambienti con hot-reload (Next.js, NestJS), evita di creare multiple istanze:

import { PrismaClient } from '@prisma/client'

const globalForPrisma = globalThis as unknown as {
  prisma: PrismaClient | undefined
}

export const prisma = globalForPrisma.prisma ?? new PrismaClient()

if (process.env.NODE_ENV !== 'production') {
  globalForPrisma.prisma = prisma
}

Gestire la Disconnessione

// In script standalone, disconnettiti sempre alla fine
async function main() {
  // ... operazioni
}

main()
  .catch(console.error)
  .finally(async () => {
    await prisma.$disconnect()
  })

In framework long-running (Express, Next.js), non serve disconnettersi manualmente: Prisma gestisce il pool automaticamente.

Testare la Connessione

async function testConnection() {
  try {
    await prisma.$connect()
    console.log('Connessione al database riuscita!')
  } catch (error) {
    console.error('Errore di connessione:', error)
    process.exit(1)
  }
}