CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl-labs/prisma-best-practices

Prisma ORM patterns — schema design, migrations, type-safe queries, testing, error handling, and performance

96

1.28x
Quality

95%

Does it follow best practices?

Impact

100%

1.28x

Average score across 3 eval scenarios

SecuritybySnyk

Passed

No known issues

Overview
Quality
Evals
Security
Files

prisma-queries-transactions.jsonverifiers/

{
  "instruction": "Write efficient Prisma queries with proper select/include usage, transactions, error handling, and batch operations",
  "relevant_when": "Agent writes Prisma Client queries, transactions, or data access code",
  "context": "Use select for list/catalog queries to reduce payload, use include for detail views that need full relation data. Use $transaction with tx parameter (not prisma) for multi-model writes. Handle P2002 unique constraint errors with PrismaClientKnownRequestError. Use createMany/updateMany for bulk operations. Use tagged template $queryRaw for raw SQL (never string interpolation). Store money as Int (cents).",
  "sources": [
    {
      "type": "file",
      "filename": "skills/prisma-best-practices/SKILL.md",
      "tile": "tessl-labs/prisma-best-practices@0.1.0"
    }
  ],
  "checklist": [
    {
      "name": "select-for-list-queries",
      "rule": "List/catalog queries use select to fetch only needed fields, not include which fetches all fields",
      "relevant_when": "Agent writes a query to list or browse records (catalog, search results, autocomplete)"
    },
    {
      "name": "include-for-detail-views",
      "rule": "Detail view queries use include to eagerly load related records (e.g., order with items and their products)",
      "relevant_when": "Agent writes a query to fetch a single record with its relations for display or processing"
    },
    {
      "name": "transaction-for-multi-writes",
      "rule": "Multi-model write operations use prisma.$transaction() to ensure atomicity",
      "relevant_when": "Agent writes code that creates/updates/deletes records across multiple models"
    },
    {
      "name": "tx-used-inside-transaction",
      "rule": "Inside $transaction(async (tx) => { ... }), all operations use the tx parameter, not the global prisma client",
      "relevant_when": "Agent writes an interactive transaction with $transaction"
    },
    {
      "name": "filter-with-where",
      "rule": "Queries use where clause to filter by status, date, or other conditions rather than filtering in application code",
      "relevant_when": "Agent queries records that need filtering"
    },
    {
      "name": "orderby-present",
      "rule": "List queries include orderBy for deterministic results (e.g., createdAt, name)",
      "relevant_when": "Agent writes findMany queries"
    },
    {
      "name": "p2002-error-handled",
      "rule": "Code that creates records with unique constraints catches PrismaClientKnownRequestError with code P2002 and returns a meaningful error",
      "relevant_when": "Agent writes create operations on models with unique constraints"
    },
    {
      "name": "money-as-int-in-queries",
      "rule": "Money/price values in create/update data use Int (cents), consistent with the schema",
      "relevant_when": "Agent writes queries that create or update monetary values"
    },
    {
      "name": "no-raw-sql-string-interpolation",
      "rule": "Raw SQL queries use $queryRaw tagged template literals for parameterization, never $queryRawUnsafe with string concatenation",
      "relevant_when": "Agent writes raw SQL queries with Prisma"
    },
    {
      "name": "batch-operations-used",
      "rule": "Bulk inserts use createMany and bulk updates use updateMany instead of individual operations in a loop",
      "relevant_when": "Agent needs to create or update many records at once"
    }
  ]
}

tile.json