00
:
00
:
00
:
00
Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

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)
  }
}