# Database Package

Prisma 6.14.0 client and schema for PostgreSQL (`@trigger.dev/database`).

## Schema

Located at `prisma/schema.prisma`. Key models include TaskRun, BackgroundWorker, BackgroundWorkerTask, WorkerDeployment, RuntimeEnvironment, and Project.

### Engine Versions

```prisma
enum RunEngineVersion {
  V1  // Legacy (MarQS + Graphile) - DEPRECATED
  V2  // Current (run-engine + redis-worker)
}
```

New code should always target V2.

## Creating Migrations

1. Edit `prisma/schema.prisma`
2. Generate migration:
   ```bash
   cd internal-packages/database
   pnpm run db:migrate:dev:create --name "descriptive_name"
   ```
3. **Clean up generated migration** - remove extraneous lines for:
   - `_BackgroundWorkerToBackgroundWorkerFile`
   - `_BackgroundWorkerToTaskQueue`
   - `_TaskRunToTaskRunTag`
   - `_WaitpointRunConnections`
   - `_completedWaitpoints`
   - `SecretStore_key_idx`
   - Various `TaskRun` indexes (unless you added them)
4. Apply migration:
   ```bash
   pnpm run db:migrate:deploy && pnpm run generate
   ```

## Index Migration Rules

When adding indexes to **existing tables**:

- Use `CREATE INDEX CONCURRENTLY IF NOT EXISTS` to avoid table locks in production
- CONCURRENTLY indexes **must be in their own separate migration file** - they cannot be combined with other schema changes (PostgreSQL requirement)
- Only add one index per migration file
- Pre-apply the index manually in production before deploying the migration (Prisma will skip creation if the index already exists)

Indexes on **newly created tables** (in the same migration as `CREATE TABLE`) do not need CONCURRENTLY and can be in the same migration file.

When adding an index on a **new column on an existing table**, use two migrations:
1. First migration: `ALTER TABLE ... ADD COLUMN IF NOT EXISTS ...` (the column)
2. Second migration: `CREATE INDEX CONCURRENTLY IF NOT EXISTS ...` (the index, in its own file)

See `README.md` in this directory and `ai/references/migrations.md` for the full index workflow.

## Read Replicas

Use `$replica` from `~/db.server` for read-heavy queries in the webapp.
