Tipi di Campo e Attributi
Tipi Scalari
Prisma supporta diversi tipi di dato che vengono mappati ai tipi nativi del database.
String
Testo di lunghezza variabile. Mappato a VARCHAR, TEXT, ecc.
model Article {
id Int @id @default(autoincrement())
title String
content String @db.Text // Specifica il tipo nativo (testo lungo)
}
Int e BigInt
Numeri interi a 32-bit e 64-bit:
model Product {
id Int @id @default(autoincrement())
quantity Int
views BigInt @default(0)
}
Float e Decimal
Float per valori approssimativi, Decimal per precisione esatta (ideale per valute):
model Transaction {
id Int @id @default(autoincrement())
score Float
amount Decimal @db.Decimal(10, 2) // 10 cifre totali, 2 decimali
}
Boolean
Vero o falso:
model User {
id Int @id @default(autoincrement())
isActive Boolean @default(true)
isAdmin Boolean @default(false)
}
DateTime
Timestamp con data e ora:
model Post {
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
publishAt DateTime?
}
Json
Dati JSON arbitrari (supportato da PostgreSQL, MySQL, MongoDB):
model Settings {
id Int @id @default(autoincrement())
preferences Json
metadata Json?
}
In TypeScript il tipo generato sara’ Prisma.JsonValue:
const settings = await prisma.settings.create({
data: {
preferences: { theme: 'dark', language: 'it' },
metadata: { version: 1, tags: ['admin', 'premium'] },
},
})
Bytes
Dati binari (file, immagini, hash):
model File {
id Int @id @default(autoincrement())
data Bytes
hash Bytes
}
Attributi di Campo
@id
Definisce la chiave primaria del modello:
model User {
id Int @id @default(autoincrement()) // Auto-increment
}
model Post {
id String @id @default(uuid()) // UUID generato automaticamente
}
model Comment {
id String @id @default(cuid()) // CUID generato automaticamente
}
@unique
Vincolo di unicita’ su un campo:
model User {
id Int @id @default(autoincrement())
email String @unique
username String @unique
}
@default
Imposta un valore predefinito:
model Post {
id Int @id @default(autoincrement())
published Boolean @default(false)
createdAt DateTime @default(now())
role Role @default(USER)
uuid String @default(uuid())
}
Funzioni disponibili: autoincrement(), now(), uuid(), cuid(), dbgenerated().
@updatedAt
Aggiorna automaticamente il campo a ogni modifica del record:
model Post {
id Int @id @default(autoincrement())
updatedAt DateTime @updatedAt
}
@map
Mappa il nome del campo Prisma a un nome diverso nella colonna del database:
model User {
id Int @id @default(autoincrement())
firstName String @map("first_name")
lastName String @map("last_name")
email String @unique @map("email_address")
}
@relation
Definisce le relazioni tra modelli (chiavi esterne):
model Post {
id Int @id @default(autoincrement())
author User @relation(fields: [authorId], references: [id])
authorId Int
}
Attributi di Blocco
Gli attributi con @@ si applicano all’intero modello.
@@unique
Vincolo di unicita’ composta (combinazione di campi):
model Enrollment {
id Int @id @default(autoincrement())
studentId Int
courseId Int
@@unique([studentId, courseId]) // Un solo enrollment per studente/corso
}
@@index
Crea un indice sul database per velocizzare le query:
model Post {
id Int @id @default(autoincrement())
title String
authorId Int
category String
@@index([authorId])
@@index([category, authorId]) // Indice composto
}
@@map
Mappa il nome del modello a un nome diverso per la tabella nel database:
model User {
id Int @id @default(autoincrement())
email String @unique
@@map("users") // La tabella nel DB si chiamera' "users"
}
@@id
Chiave primaria composta (quando non hai un singolo campo @id):
model PostTag {
postId Int
tagId Int
post Post @relation(fields: [postId], references: [id])
tag Tag @relation(fields: [tagId], references: [id])
@@id([postId, tagId]) // Chiave primaria composta
}
Modificatori di Tipo
Opzionale (?)
Un campo opzionale puo’ essere null:
model User {
id Int @id @default(autoincrement())
name String? // Puo' essere null
bio String?
}
Lista ([])
Un campo lista contiene un array di valori (supportato da alcuni database):
model User {
id Int @id @default(autoincrement())
tags String[] // Array di stringhe (PostgreSQL)
}