Prisma ORM - Opérations de base de données type-safe

VérifiéSûr

ORM moderne pour PostgreSQL offrant des opérations type-safe, génération automatique de types et gestion des migrations. Remplace les requêtes SQL brutes par un modèle déclaratif sécurisé.

Spar Skills Guide Bot
DeveloppementIntermédiaire
3002/06/2026
Claude Code
#prisma#orm#type-safe#postgresql

Recommandé pour

Notre avis

Fournit des opérations de base de données type-safe avec Prisma ORM comme alternative au SQL brut, avec génération automatique de types, modélisation déclarative du schéma et gestion des migrations.

Points forts

  • Génération automatique de types TypeScript pour des requêtes type-safe
  • Modélisation déclarative des schémas avec gestion des relations et contraintes
  • Gestion simplifiée des migrations de base de données
  • Élimine les risques d'injection SQL et le mapping manuel des lignes

Limites

  • Nécessite de synchroniser les changements de schéma avec Prisma via des migrations
  • Peut avoir une courbe d'apprentissage pour les requêtes complexes ou les transactions avancées
  • Ajoute une couche d'abstraction qui peut être excessive pour des projets très simples
Quand l'utiliser

Utilisez Prisma lorsque vous construisez un nouveau backend ou refactorez une base de code existante pour ajouter la sécurité de type et remplacer les requêtes SQL brutes par un ORM.

Quand l'éviter

Évitez Prisma si votre projet est très simple et que les requêtes SQL brutes suffisent, ou si vous avez besoin de requêtes extrêmement optimisées en dessous du niveau d'abstraction de l'ORM.

Analyse de sécurité

Sûr
Score qualité88/100

The skill instructs standard npm install and npx init commands for setting up the official Prisma ORM. No destructive, exfiltrating, or obfuscated actions are suggested. The use of Bash is limited to safe developer operations.

Aucun point d'attention détecté

Exemples

Initialize Prisma with PostgreSQL
Set up Prisma ORM for the backend folder. Install prisma and @prisma/client, run npx prisma init, and configure the PostgreSQL connection using environment variables.
Define Product model with relations
Create a Prisma schema with Product, ProductTranslation, and OrderItem models. Include fields like id, name, price, relations, and use @map and @@map for snake_case column mapping.
Create a transaction for order creation
Write a Prisma transaction that creates an order, updates inventory counts, and handles errors atomically. Use prisma.$transaction with an interactive callback.

name: prisma description: | Prisma ORM for type-safe database operations with PostgreSQL. Use when: Defining schemas, writing type-safe queries, creating migrations, modeling relations, or replacing raw SQL with ORM patterns. allowed-tools: Read, Edit, Write, Glob, Grep, Bash

Prisma Skill

Provides type-safe database operations as an alternative to raw SQL. This codebase currently uses the pg library with raw SQL queries. Prisma offers automatic type generation, declarative schema modeling, and migration management - eliminating the manual row mapping and SQL injection risks present in raw SQL approaches.

Quick Start

Install and Initialize

cd backend
npm install prisma @prisma/client
npx prisma init

Schema Definition

// prisma/schema.prisma
generator client {
  provider = "prisma-client-js"
}

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

model Product {
  id               Int                    @id @default(autoincrement())
  name             String
  shortDescription String                 @map("short_description")
  description      String
  price            Decimal                @db.Decimal(10, 2)
  salePrice        Decimal?               @map("sale_price") @db.Decimal(10, 2)
  imageUrl         String                 @map("image_url")
  inventory        Int                    @default(0)
  categories       Json
  highlights       Json?
  usage            String?
  isNew            Boolean                @default(false) @map("is_new")
  isFeatured       Boolean                @default(false) @map("is_featured")
  salesCount       Int                    @default(0) @map("sales_count")
  createdAt        DateTime               @default(now()) @map("created_at")
  updatedAt        DateTime               @updatedAt @map("updated_at")
  translations     ProductTranslation[]
  orderItems       OrderItem[]
  variants         ProductVariant[]

  @@map("products")
}

model ProductTranslation {
  id              Int      @id @default(autoincrement())
  productId       Int      @map("product_id")
  languageCode    String   @map("language_code") @db.VarChar(10)
  name            String   @db.VarChar(255)
  shortDescription String  @map("short_description")
  description     String
  highlights      Json?
  usage           String?
  slug            String?  @db.VarChar(255)
  createdAt       DateTime @default(now()) @map("created_at")
  updatedAt       DateTime @updatedAt @map("updated_at")
  product         Product  @relation(fields: [productId], references: [id], onDelete: Cascade)
  language        Language @relation(fields: [languageCode], references: [code], onDelete: Cascade)

  @@unique([productId, languageCode])
  @@map("product_translations")
}

Client Usage

// backend/src/db/prisma.ts
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient({
  log: process.env.NODE_ENV === 'development' ? ['query', 'warn', 'error'] : ['error'],
});

export { prisma };

Key Concepts

| Concept | Usage | Example | |---------|-------|---------| | @map | Map field to snake_case column | @map("created_at") | | @@map | Map model to table name | @@map("products") | | Relations | Define FK relationships | product Product @relation(...) | | @db.Decimal | Specify PostgreSQL types | @db.Decimal(10, 2) | | @@unique | Composite unique constraints | @@unique([productId, languageCode]) | | Transactions | Atomic operations | prisma.$transaction([...]) |

Common Patterns

Fetching with Translation Fallback

When: Getting localized content with English fallback

const product = await prisma.product.findUnique({
  where: { id: productId },
  include: {
    translations: {
      where: { languageCode: lang },
    },
  },
});

// Apply translation or fallback to base
const name = product.translations[0]?.name ?? product.name;

Transactions for Orders

When: Creating orders with inventory updates

await prisma.$transaction(async (tx) => {
  const order = await tx.order.create({ data: orderData });
  
  for (const item of items) {
    await tx.orderItem.create({
      data: { orderId: order.id, ...item },
    });
    await tx.product.update({
      where: { id: item.productId },
      data: { inventory: { decrement: item.quantity } },
    });
  }
  
  return order;
});

See Also

  • patterns - Query patterns and model design
  • workflows - Migrations and schema management

Related Skills

  • See the postgresql skill for raw SQL patterns and PostgreSQL-specific features
  • See the typescript skill for type inference patterns with Prisma
  • See the zod skill for runtime validation of Prisma inputs
Skills similaires