92-database

Database schema and migration rules for Prisma, Drizzle, and SQL files. A database schema describes tables and relationships; a migration is a controlled change to that structure.

In plain words
What is it for?
Use them when designing tables, relationships, indexes, multi-tenant isolation, or new database migrations.
Why use it?
They reduce inconsistent table designs and prevent changes to already-deployed migrations from causing deployment or data problems.

Cursor rule for Cursor

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add rules/zoxknez/ai-coding-rules/92-database
Clone the repo
git clone --depth 1 https://github.com/zoxknez/ai-coding-rules

Made for: Cursor.

Per session 0 Nothing until a file matches its globs; then the whole rule loads.
When invoked 899 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.00000 $0.00899
Opus 5 $0.00000 $0.00449
Sonnet 5 $0.00000 $0.00180
Haiku 4.5 $0.00000 $0.00090

Measured 2d ago against content hash 371b5cbab0da, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

92-database scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

Origin

Copies of this mod

1 near-identical copy found in the catalogue:

.cursor/rules/92-database.mdc · 150 lines

How it starts

The opening of the file, as written. The whole thing — 150 lines — stays where its author put it; the contents beside it link to each section on GitHub.

🗃️ Database Rules

Auto-activated for Prisma, Drizzle, and SQL files.

Schema Design

1. Naming Conventions

// ✅ GOOD
model User {
  id        String   @id @default(cuid())
  email     String   @unique
  createdAt DateTime @default(now()) @map("created_at")
  updatedAt DateTime @updatedAt @map("updated_at")

  @@map("users")  // snake_case table name
}

// ✅ Relations: explicit names
model Post {
  author   User   @relation("PostAuthor", fields: [authorId], references: [id])
  authorId String @map("author_id")
}

2. Required Fields (STRICT)

Every table MUST have:

  • id — Primary key (cuid or uuid preferred)
  • created_at — Creation timestamp
  • updated_at — Last update timestamp

For multi-tenant apps:

  • tenant_id — Tenant isolation (CRITICAL)

3. Indexes

// ✅ Index frequently queried fields
model Order {
  id        String @id
  userId    String
  status    String
  createdAt DateTime

  @@index([userId])           // FK queries
  @@index([status, createdAt]) // Filtered queries
}

Migration Rules (STRICT)

1. Never Edit Existing Migrations

# ❌ NEVER modify deployed migrations
# ✅ Create new migration for changes
npx prisma migrate dev --name fix_user_email

2. Reversible Migrations

-- ✅ Always provide rollback
-- Migration: add_status_column
ALTER TABLE orders ADD COLUMN status VARCHAR(20) DEFAULT 'pending';

-- Rollback:
-- ALTER TABLE orders DROP COLUMN status;

3. Data Migrations Separate

migrations/
├── 001_add_status_column.sql  # Schema only
└── 001_backfill_status.ts     # Data migration (separate)

Query Patterns

1. Parameterized Queries (STRICT)

// ✅ ALWAYS use parameterized queries
const user = await prisma.user.findUnique({
  where: { email: sanitizedEmail }
});

// ❌ NEVER concatenate SQL
const query = `SELECT * FROM users WHERE email = '${email}'`; // SQL INJECTION!

2. Select Only Needed Fields

// ✅ GOOD: Select specific fields
const users = await prisma.user.findMany({
  select: { id: true, email: true, name: true }
});

// ❌ BAD: Select all (may include sensitive data)
const users = await prisma.user.findMany();

Read the full file on GitHub · 150 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 2d ago First seen · 150 lines · 0 tokens per session scan A 371b5cbab0da

Subscribe to this mod's changes

92-database is a cursor rule published in the GitHub repository zoxknez/ai-coding-rules (27 stars, last pushed 4mo ago), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 899 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.