К основному содержанию
скилл Claude Code CX Codex Cursor GitHub Copilot

prisma-driver-adapter-implementation — скилл для Claude Code: Prisma

Справочник по реализации SQL-адаптеров для Prisma ORM 7. Нужен при работе с транзакциями, savepoint-ами, маппингом значений и обработкой ошибок БД.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add prisma/skills --skill prisma-driver-adapter-implementation -a claude-code
Открыть на GitHub

Что делает prisma-driver-adapter-implementation

Скилл содержит контракт интерфейсов SqlDriverAdapter, Transaction и фабрик адаптеров, плюс приоритетные правила: одно соединение на транзакцию, правильный маппинг типов столбцов и аргументов, сохранение исходных ошибок БД, корректная очистка ресурсов.

Внутри — примеры кода для queryRaw, executeRaw, executeScript, обработки транзакций и savepoint-ов. Описано, как маппить результаты (int32/int64, decimal, bytes, date/time, UUID, JSON), выполнять миграционные скрипты через парсер вместо наивного разбиения на ;, координировать commit/rollback как lifecycle-хуки без повторного SQL.

Применяй при добавлении нового драйвера БД, модификации существующего адаптера, отладке утечек транзакций или проблем с shadow-database. Требует установленной версии @prisma/driver-adapter-utils, которую тянет Prisma.

Какие задачи решает

  • реализовать SQL-адаптер для новой БД в Prisma 7
  • отладить утечку транзакций или проблемы с соединениями
  • маппить типы столбцов и аргументы запроса без потери данных
  • добавить поддержку nested-транзакций через savepoint-ы
  • обработать и сохранить оригинальные ошибки БД

Примеры запросов агенту

  • Покажи контракт `SqlDriverAdapter` и правила lifecycle для commit/rollback
  • Помоги реализовать `queryRaw` с маппингом типов аргументов и результатов
  • Объясни, как организовать одно соединение на транзакцию и правильно освободить его

Как установить prisma-driver-adapter-implementation

1Через Skills CLI (Vercel)

npx skills add prisma/skills --skill prisma-driver-adapter-implementation -a claude-code

2Вручную: положить файлы

~/.claude/skills/prisma-driver-adapter-implementation/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/prisma-driver-adapter-implementation/

Из того же набора10

Весь набор →
prisma-client-api prisma Справочник по Prisma Client API для написания запросов к БД, CRUD-операций и фильтрации. Срабатывает на упоминания findMany, create, update, delete и транзакций. Claude Code CX Codex Cursor +1 389 500установок prisma-database-setup prisma Устаревшее совместимое имя для скилла prisma-orm-setup, который настраивает Prisma и чинит подключения к базе данных. Claude Code CX Codex Cursor +1 388 400установок prisma-cli prisma Справочник по командам Prisma ORM 7 для ИИ-агентов. Помогает запускать миграции, генерировать клиент и безопасно работать с базой данных без случайного сброса данных. Claude Code CX Codex Cursor +1 386 800установок prisma-postgres prisma Устаревший скилл, перенаправляющий на prisma-postgres-setup. Используйте его только если явно вызывается по имени; в новых проектах выбирайте prisma-postgres-setup. Claude Code CX Codex Cursor +1 380 400установок prisma-postgres-setup prisma Подключает Prisma Postgres к проекту или создаёт временную базу данных без регистрации. Пригодится, когда приложению нужна база с нуля или через Vercel Marketplace. Claude Code CX Codex Cursor +1 374 900установок prisma-upgrade-v7 prisma Полный гайд по переходу с Prisma ORM v6 на v7 со всеми критическими изменениями: новый генератор, обязательные драйверы, ESM-конфиг и переделка импортов. Используй, когда обновляешь Prisma или сталкиваешься с ошибками v7. Claude Code CX Codex Cursor +1 374 800установок prisma-compute prisma Скилл для развёртывания TypeScript-приложений на Prisma Compute через Prisma 8 CLI. Помогает управлять деплоями, версиями, переменными окружения и пользовательскими доменами прямо из редактора кода. Claude Code CX Codex Cursor +1 370 000установок prisma-mongodb-upgrade prisma Помогает спланировать переход проектов на Prisma ORM с MongoDB с версии 6 сразу на 8 либо обоснованно остаться на v6 из-за отсутствия коннектора в Prisma 7. Claude Code CX Codex Cursor +1 368 500установок

Похожие

saga-orchestration Seth Hobson Скилл проектирует саги для распределённых транзакций и долгих бизнес-процессов. Пригодится, когда 2PC недоступен и нужны компенсирующие действия. Claude Code CX Codex Cursor 10 700установок projection-patterns Seth Hobson Скилл помогает проектировать модели чтения из потоков событий. Подойдёт для CQRS, материализованных представлений и поисковых индексов. Claude Code CX Codex Cursor 10 500установок mcp-builder официальный anthropics Скилл проводит через создание MCP-сервера на TypeScript или Python: от изучения протокола до тестов и оценки качества. Claude Code Claude.ai 130 949установок google-agents-cli-adk-code официальный Google Скилл даёт примеры и справку по Agent Development Kit: агентам, инструментам, колбэкам, состоянию и графовым workflow. Нужен при написании кода. Claude Code CX Codex Cursor +1 511 400установок lark-im larksuite Скилл подключает Lark IM к агенту: он отправляет сообщения, ищет историю, управляет чатами и файлами. Подойдёт для задач вокруг командных коммуникаций. Claude Code CX Codex Cursor +1 472 300установок lark-event larksuite Слушает события Lark/Feishu и отдаёт их потоком NDJSON. Подходит для ботов, обработчиков сообщений и долгих подписчиков. Claude Code CX Codex Cursor +1 466 200установок caveman-discover JuliusBrussee Находит точки вызова LLM в репозитории и размечает их воркфлоу для Caveman Cloud, чтобы расходы на токены не сливались в одну общую кучу. Claude Code CX Codex Cursor +1 103 500установок migration JuliusBrussee Скилл задаёт правила безопасных миграций схем, данных и API с обязательным откатом. Пригодится при изменениях, где нельзя терять данные или ломать совместимость. Claude Code CX Codex Cursor +1 102 900установок

Вопросы о prisma-driver-adapter-implementation

Как установить prisma-driver-adapter-implementation в Claude Code?

Выполни npx skills add prisma/skills --skill prisma-driver-adapter-implementation -a claude-code, затем открой ~/.claude/skills/prisma-driver-adapter-implementation/SKILL.md.

Что делает prisma-driver-adapter-implementation?

Предоставляет справочник по контрактам, правилам приоритета и примерам кода для реализации и отладки SQL-адаптеров в Prisma ORM 7. Покрывает транзакции, savepoint-ы, маппинг типов и обработку ошибок.

Нужна ли конкретная версия Prisma?

Да, используй скилл с версией @prisma/driver-adapter-utils, которую устанавливает целевой релиз Prisma. Адаптеры — граница протокола: тип-совместимый код всё ещё может повредить значения или сломать транзакции.

Исходный текст

SKILL.md · MIT
---
name: prisma-driver-adapter-implementation
description: Required reference for Prisma ORM 7 SQL driver adapter work. Use when implementing or modifying adapters, adding database drivers, or touching SqlDriverAdapter, Transaction, savepoint, result mapping, or DriverAdapterError behavior. Covers current transaction lifecycle, optional savepoint hooks, original database-error preservation, and verification.
license: MIT
metadata:
  author: prisma
  version: "7.9.1"
---

# Prisma SQL Driver Adapter Implementation

Use this guide with the exact `@prisma/driver-adapter-utils` version installed by the target Prisma release. Driver adapters are a protocol boundary: type-compatible code can still corrupt values, leak connections, or break transactions.

## When to Apply

- Implementing `SqlDriverAdapterFactory`, `SqlMigrationAwareDriverAdapterFactory`, `SqlDriverAdapter`, or `Transaction`
- Adding nested-transaction/savepoint support
- Mapping driver values, column metadata, bind arguments, or database errors
- Debugging `P2039`, transaction leaks, shadow-database failures, or adapter-specific query behavior

## Contract snapshot

```typescript
interface SqlDriverAdapterFactory extends AdapterInfo {
  connect(): Promise<SqlDriverAdapter>
}

interface SqlMigrationAwareDriverAdapterFactory extends SqlDriverAdapterFactory {
  connectToShadowDb(): Promise<SqlDriverAdapter>
}

interface SqlDriverAdapter extends AdapterInfo {
  queryRaw(query: SqlQuery): Promise<SqlResultSet>
  executeRaw(query: SqlQuery): Promise<number>
  executeScript(script: string): Promise<void>
  startTransaction(isolationLevel?: IsolationLevel): Promise<Transaction>
  getConnectionInfo?(): ConnectionInfo
  dispose(): Promise<void>
}

interface Transaction extends AdapterInfo {
  readonly options: { usePhantomQuery: boolean }
  queryRaw(query: SqlQuery): Promise<SqlResultSet>
  executeRaw(query: SqlQuery): Promise<number>
  commit(): Promise<void>
  rollback(): Promise<void>
  createSavepoint?(name: string): Promise<void>
  rollbackToSavepoint?(name: string): Promise<void>
  releaseSavepoint?(name: string): Promise<void>
}
```

`IsolationLevel` currently includes `READ UNCOMMITTED`, `READ COMMITTED`, `REPEATABLE READ`, `SNAPSHOT`, and `SERIALIZABLE`; validate what the concrete database supports.

## Priority rules

| Priority | Rule | Impact |
|----------|------|--------|
| CRITICAL | One dedicated connection per transaction | Prevents interleaving and leaks |
| CRITICAL | `commit`/`rollback` are lifecycle cleanup hooks | Prevents duplicate COMMIT/ROLLBACK |
| CRITICAL | Savepoints live on `Transaction`, not adapter-global depth | Makes nested scopes connection-local |
| CRITICAL | Preserve original database error code/message | Enables useful `P2039` fallback |
| HIGH | Map arguments and result metadata exactly | Prevents silent value corruption |
| HIGH | Shadow databases are isolated and always cleaned up | Makes Migrate safe |
| HIGH | Dispose only resources the adapter owns | Prevents shutting down caller-owned pools |

## Query implementation

`SqlQuery` contains `sql`, `args`, and parallel `argTypes`. Map each argument using both value and `ArgType`; do not discard type/arity information. Execute in the driver's array/tuple row mode so column order is stable.

```typescript
class ExampleQueryable {
  readonly provider = 'postgres' as const
  readonly adapterName = '@acme/adapter-example'

  constructor(protected readonly connection: DriverConnection) {}

  async queryRaw(query: SqlQuery): Promise<SqlResultSet> {
    try {
      const result = await this.connection.query({
        text: query.sql,
        values: query.args.map((value, index) =>
          mapArg(value, query.argTypes[index]),
        ),
        rowMode: 'array',
      })

      return {
        columnNames: result.fields.map((field) => field.name),
        columnTypes: result.fields.map(mapColumnType),
        rows: result.rows,
      }
    } catch (error) {
      throwAdapterError(error)
    }
  }

  async executeRaw(query: SqlQuery): Promise<number> {
    try {
      const result = await this.connection.execute(
        query.sql,
        query.args.map((value, index) => mapArg(value, query.argTypes[index])),
      )
      return result.rowsAffected ?? 0
    } catch (error) {
      throwAdapterError(error)
    }
  }
}
```

### Result mapping

Return `columnNames`, `columnTypes`, and `rows` with identical lengths/order. Map driver metadata to `ColumnTypeEnum` deliberately:

- signed integer widths to `Int32`/`Int64`; preserve 64-bit values without JS number truncation
- decimal/numeric to `Numeric` using the representation expected by Prisma
- binary to `Uint8Array`/`Bytes`
- date-only, time-only, and timestamp to `Date`, `Time`, and `DateTime`
- UUID, JSON, enum, arrays, and provider-specific unknown values to their explicit types
- unsupported native types to `DriverAdapterError({ kind: 'UnsupportedNativeDataType', type })`

Test `null`, empty arrays, array element types, big integers, decimals, byte arrays, JSON, dates, and user-defined/unknown native types.

### Script execution

`executeScript` must execute a migration script as the provider expects. Prefer the driver's native multi-statement/script facility or a real SQL parser. Naively splitting on `;` breaks functions, triggers, quoted strings, and dialect-specific blocks.

## Transaction protocol

`startTransaction` must acquire one dedicated connection, start the database transaction, apply the requested isolation level, and return a `Transaction` bound to that same connection. If setup fails, release it immediately.

```typescript
async startTransaction(level?: IsolationLevel): Promise<Transaction> {
  const connection = await this.pool.acquire()
  try {
    const tx = new ExampleTransaction(connection, () => connection.release())
    await tx.executeRaw({ sql: 'BEGIN', args: [], argTypes: [] })
    if (level) {
      await tx.executeRaw({
        sql: `SET TRANSACTION ISOLATION LEVEL ${validateLevel(level)}`,
        args: [],
        argTypes: [],
      })
    }
    return tx
  } catch (error) {
    connection.release(error)
    throwAdapterError(error)
  }
}
```

### Commit and rollback

Prisma coordinates the SQL `COMMIT`/`ROLLBACK` through `executeRaw`. The transaction object's `commit()` and `rollback()` methods are lifecycle hooks: detach listeners and release the dedicated connection exactly once. They must not issue a second SQL commit/rollback.

```typescript
class ExampleTransaction extends ExampleQueryable implements Transaction {
  readonly options = { usePhantomQuery: false }
  #closed = false

  constructor(connection: DriverConnection, private readonly release: () => void) {
    super(connection)
  }

  async commit() { this.finish() }
  async rollback() { this.finish() }

  private finish() {
    if (this.#closed) return
    this.#closed = true
    this.release()
  }

  async createSavepoint(name: string) {
    await this.control(`SAVEPOINT ${safeSavepoint(name)}`)
  }

  async rollbackToSavepoint(name: string) {
    await this.control(`ROLLBACK TO SAVEPOINT ${safeSavepoint(name)}`)
  }

  async releaseSavepoint(name: string) {
    await this.control(`RELEASE SAVEPOINT ${safeSavepoint(name)}`)
  }

  private async control(sql: string) {
    await this.executeRaw({ sql, args: [], argTypes: [] })
  }
}
```

Implement the optional savepoint methods only where the provider supports them. Validate/quote savepoint identifiers. For providers whose savepoints are intentionally no-ops, document and test that limitation.

Never keep transaction depth on the shared adapter. Parallel transactions make adapter-global depth incorrect; nested state belongs to the returned transaction connection and Prisma's savepoint calls.

## Error mapping

Wrap recognized driver failures in `DriverAdapterError`. Map known conditions to `MappedError` kinds such as constraint violations, authentication/reachability, missing table/column/database, timeouts, closed transactions, invalid input, value range, and write conflicts.

For database errors, preserve `originalCode` and `originalMessage` even when falling back to the provider-specific raw variant:

```typescript
import {
  DriverAdapterError,
  type Error as DriverAdapterErrorObject,
  type MappedError,
} from '@prisma/driver-adapter-utils'

function convertDriverError(error: DatabaseError): DriverAdapterErrorObject {
  return {
    originalCode: String(error.code),
    originalMessage: error.message,
    ...mapKnownOrRaw(error),
  }
}

function mapKnownOrRaw(error: DatabaseError): MappedError {
  if (error.code === '23505') {
    return { kind: 'UniqueConstraintViolation', constraint: parsedConstraint(error) }
  }
  return {
    kind: 'postgres',
    code: String(error.code ?? 'N/A'),
    severity: error.severity ?? 'N/A',
    message: error.message,
    detail: error.detail,
    column: error.column,
    hint: error.hint,
  }
}

function throwAdapterError(error: unknown): never {
  if (!isDatabaseError(error)) throw error
  throw new DriverAdapterError(convertDriverError(error))
}
```

Prisma uses preserved original details when an unmapped driver error becomes `P2039`. Do not replace every unknown exception with a fabricated `GenericJs` id; rethrow genuinely unexpected non-driver errors so programming bugs remain visible.

## Factory, ownership, and shadow database

- `connect()` returns a fresh usable adapter connection/pool wrapper.
- Track whether the factory created the pool. `dispose()` closes owned pools and only detaches listeners from caller-owned pools unless an explicit option transfers ownership.
- Implement `SqlMigrationAwareDriverAdapterFactory` only when `connectToShadowDb()` can create an isolated shadow database, connect to it, and drop it during disposal/failure cleanup.
- Never point the shadow adapter at the primary database. Quote generated identifiers and use cryptographically unique names.
- `getConnectionInfo()` should accurately report `schemaName`, `maxBindValues` when applicable, and `supportsRelationJoins`.

## Verification checklist

- [ ] Typecheck against the exact target `@prisma/driver-adapter-utils` version
- [ ] `queryRaw` preserves column order, types, nulls, and precision
- [ ] `executeRaw` reports affected rows correctly
- [ ] `executeScript` handles provider-specific multi-statement syntax
- [ ] Concurrent interactive transactions use distinct dedicated connections
- [ ] Success commits and releases once; failure rolls back and releases once
- [ ] Nested transaction tests exercise create/rollback/release savepoint hooks
- [ ] Unsupported isolation levels fail as `InvalidIsolationLevel`
- [ ] Known constraints map to structured errors
- [ ] Unmapped database errors retain original code/message and surface useful `P2039`
- [ ] Dispose ownership is tested for internal and external pools
- [ ] Shadow database creation, use, failure cleanup, and disposal are isolated
- [ ] Run Prisma Client integration/E2E tests, not only adapter unit tests

## Source references

- [Driver adapter interfaces](https://github.com/prisma/prisma/blob/v7/packages/driver-adapter-utils/src/types.ts)
- [PostgreSQL adapter transaction implementation](https://github.com/prisma/prisma/blob/v7/packages/adapter-pg/src/pg.ts)
- [PostgreSQL adapter error mapping](https://github.com/prisma/prisma/blob/v7/packages/adapter-pg/src/errors.ts)

© prisma · MIT · prisma/skills

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой