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

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