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

VérifiéSûr

ORM Prisma pour des opérations de base de données type-safe avec PostgreSQL. Remplacez les requêtes SQL brutes par un schéma déclaratif, migrations automatiques et génération de types.

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

Recommandé pour

Notre avis

Ce skill permet d'utiliser Prisma ORM pour effectuer des opérations de base de données typées avec PostgreSQL, en remplaçant les requêtes SQL brutes par un schéma déclaratif et une génération automatique de types.

Points forts

  • Génération automatique de types TypeScript à partir du schéma, éliminant les erreurs de mapping manuel.
  • Gestion des migrations et des relations simplifiée avec une syntaxe déclarative.
  • Prévention des injections SQL grâce à une API sécurisée.
  • Support des transactions atomiques et des requêtes avancées (include, where, etc.).

Limites

  • Peut être moins performant que du SQL optimisé à la main pour les requêtes très complexes.
  • Nécessite une phase d'apprentissage pour les développeurs habitués au SQL brut.
  • Les migrations automatiques peuvent parfois être délicates en production (nécessitent une revue).
Quand l'utiliser

Utilisez ce skill pour toute nouvelle fonctionnalité nécessitant des accès à la base de données, afin de bénéficier de la sécurité et de la productivité de l'ORM.

Quand l'éviter

Évitez-le pour des requêtes extrêmement complexes ou des optimisations de performance très fines, où du SQL pur serait plus approprié.

Analyse de sécurité

Sûr
Score qualité90/100

The skill provides guidance on using Prisma ORM with safe installation commands and type-safe patterns. No destructive, exfiltration, or obfuscation instructions are present.

Aucun point d'attention détecté

Exemples

Define Prisma schema for a Product model
Create a Prisma schema for a Product model with fields: id (auto-increment), name, shortDescription (mapped to short_description), description, price (Decimal), salePrice (optional), imageUrl, inventory (default 0), categories (JSON), highlights (optional JSON), usage (optional), isNew (default false), isFeatured (default false), salesCount (default 0), and timestamps. Also add a related ProductTranslation model with a composite unique constraint on (productId, languageCode). Map models to 'products' and 'product_translations' tables respectively.
Fetch product with translation fallback
Using Prisma, write a function to fetch a product by ID including its translations filtered by a given language code. If no translation is found, fall back to the base product's name and description.
Run a transaction to create an order
Write a Prisma transaction that creates an order with multiple line items, decreases inventory for each product, and updates the sales count. Ensure atomicity so that if any step fails, all changes are rolled back.

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