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