Prisma ORM patterns — schema design, migrations, type-safe queries, testing, error handling, and performance
96
95%
Does it follow best practices?
Impact
100%
1.28xAverage score across 3 eval scenarios
Passed
No known issues
{
"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"
}
]
}