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

VérifiéPrudence

ORM moderne pour PostgreSQL offrant des schémas déclaratifs, génération de types automatique et gestion des migrations. Remplace les requêtes SQL brutes par des opérations type-safe avec protection contre les injections SQL.

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

Recommandé pour

Notre avis

Fournit des opérations de base de données type-safe avec Prisma ORM, une alternative au SQL brut pour PostgreSQL.

Points forts

  • Génération automatique des types TypeScript
  • Gestion des migrations et des relations
  • Élimination des risques d'injection SQL
  • Modélisation déclarative du schéma

Limites

  • Nécessite d'apprendre la syntaxe Prisma
  • Peut ne pas couvrir toutes les requêtes SQL complexes
  • Ajoute une dépendance supplémentaire au projet
Quand l'utiliser

Utilisez Prisma pour un accès base de données type-safe et éviter le SQL brut dans un projet Node.js avec PostgreSQL.

Quand l'éviter

Évitez Prisma pour des scripts simples ou lorsque vous avez besoin d'un contrôle maximal sur les requêtes SQL et la performance.

Analyse de sécurité

Prudence
Score qualité88/100

The skill includes Bash commands for installing npm packages and running npx, which can execute remote code from the npm registry. However, these are standard development tasks for a widely trusted ORM (Prisma) and not inherently destructive. The skill does not instruct downloading from untrusted sources or executing obfuscated payloads.

Aucun point d'attention détecté

Exemples

Set up Prisma with PostgreSQL
Set up Prisma in a Node.js project with PostgreSQL. Initialize Prisma, define a Product model with fields like name, price, and a relation to a ProductTranslation model, and run the initial migration.
Create a Prisma migration
Create a Prisma migration to add a 'salePrice' column (nullable Decimal) to the Product model and update the schema.
Fetch product with translation fallback
Write a Prisma query to fetch a product by ID and include its translations where languageCode matches a given language. Fallback to the base product name if no translation is found.

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