К основному содержанию
скилл CX Codex

drizzle-orm-d1 — скилл для Claude Code: Drizzle ORM и Cloudflare D1

Скилл для работы с Cloudflare D1 через Drizzle ORM: схемы, типизированные запросы, миграции Drizzle Kit и разбор типовых ошибок D1.

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

Что делает drizzle-orm-d1

Скилл добавляет агенту контекст по Drizzle ORM поверх Cloudflare D1. Внутри — настройка drizzle.config.ts, определение таблиц через sqliteTable, связи через relations, генерация и применение миграций. Отдельная часть посвящена ошибкам: D1_ERROR: Cannot use BEGIN TRANSACTION, FOREIGN KEY constraint failed, env.DB is undefined, проблемы с выводом типов.

Ключевое ограничение D1: транзакций в привычном виде нет. Вместо db.transaction() скилл требует db.batch([...]), потому что SQL BEGIN TRANSACTION в D1 не работает. Даты хранятся как integer с mode: 'timestamp' — родного типа даты у D1 нет. Для динамических значений по умолчанию нужен .$defaultFn(), а не .default().

Миграции идут только через Wrangler: drizzle-kit generate, затем wrangler d1 migrations apply сначала с --local, потом с --remote. Смешивать drizzle-kit migrate и wrangler apply нельзя. Для удалённых миграций и Studio в конфиге нужны accountId, databaseId и token — их берут из переменных окружения, а не пишут в файл. В drizzle.config.ts обязателен dialect: 'sqlite'.

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

  • описать схему D1 в TypeScript без ручного SQL
  • сгенерировать и применить миграцию локально, затем в прод
  • заменить неработающую транзакцию на batch API
  • починить FOREIGN KEY constraint failed через каскадное удаление
  • получить типы строк таблицы без ошибки о слишком глубокой инстанциации

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

  • Опиши схему D1 для таблиц users и posts через drizzle-orm/sqlite-core, добавь связи
  • Сгенерируй миграцию из текущей схемы и подскажи команды для локального применения
  • У меня падает D1_ERROR: Cannot use BEGIN TRANSACTION — перепиши этот код на db.batch()

Как установить drizzle-orm-d1

1Через Skills CLI (Vercel)

npx skills add secondsky/claude-skills --skill drizzle-orm-d1 -a claude-code

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

~/.claude/skills/drizzle-orm-d1/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/drizzle-orm-d1/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

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

recommendation-engine Скилл для построения рекомендательных систем: коллаборативная фильтрация, матричная факторизация, гибридные подходы. Пригодится, когда нужны персональные подборки товаров или контента. CX Codex +1 423установок api-response-optimization Скилл для ИИ-кодинга, который подсказывает, как уменьшить размер ответов API, включить кэширование и сжатие. Пригодится, когда эндпоинты отвечают медленно. CX Codex +1 422установок api-filtering-sorting Скилл для ИИ-агента, который помогает собрать фильтрацию и сортировку в API: разбор query-параметров, валидация, защита от инъекций. CX Codex +1 418установок bun-drizzle-integration Скилл подсказывает агенту, как связать Drizzle ORM с драйвером bun:sqlite: схема, миграции, CRUD и транзакции в одном месте. CX Codex +1 420установок push-notification-setup Скилл проводит агента по настройке пуш-уведомлений через Firebase Cloud Messaging и нативные сервисы. Пригодится, когда добавляешь уведомления в приложение или разбираешься с фоновыми сообщениями. CX Codex +1 418установок bun-runtime Скилл для работы с рантаймом Bun: запуск файлов, режимы watch и hot, переменные окружения, флаги CLI и разрешение модулей. CX Codex +1 414установок defense-in-depth-validation Скилл учит агента ставить проверки данных на всех слоях, чтобы баг стал структурно невозможным. Пригодится, когда невалидные данные ломают выполнение глубоко в коде. CX Codex +1 413установок ultracite Скилл для настройки Ultracite: линтинг и форматирование JS/TS через Biome, ESLint или Oxlint. Помогает с миграцией и разбором ошибок конфигурации. CX Codex +1 415установок

Похожие

d1-drizzle-schema jezweb Генерирует схемы Drizzle ORM с учётом ограничений Cloudflare D1. Помогает описать таблицы, настроить миграции и задокументировать структуру базы данных. CX Codex +1 1 700установок drizzle-orm Mindrally Скилл задаёт агенту правила разработки на Drizzle ORM: схема как код, типы из таблиц, запросы и миграции. CX Codex +1 1 000установок drizzle-migrations bobmatnyc Скилл задаёт порядок работы с базой в TypeScript: сначала SQL-миграция, потом схема. Пригодится, когда схема меняется в нескольких окружениях. CX Codex +1 1 300установок drizzle-best-practices Marc A. Maceira Zayas Скилл подсказывает агенту, как правильно писать схемы, запросы и связи в Drizzle ORM на PostgreSQL. Пригодится, когда проект на TypeScript и Postgres. CX Codex +1 685установок drizzle sanjeed5 Правило задаёт агенту Cursor стиль работы с Drizzle ORM: модульные схемы, явные ограничения полей и единый нейминг в TypeScript-проекте. ★ 3 579звёзд репо drizzle-orm-patterns giuseppe-trisciuoglio Помогает писать типобезопасные схемы, запросы и миграции на Drizzle ORM. Пригодится при работе с таблицами, связями и транзакциями. CX Codex +1 5 400установок

Рядом в теме «Данные и базы»

Все скиллы по теме «Данные и базы» →

Вопросы о drizzle-orm-d1

Как установить drizzle-orm-d1 в Claude?

Выполните npx skills add secondsky/claude-skills --skill drizzle-orm-d1 -a claude-code. Скилл появится в ~/.claude/skills/drizzle-orm-d1/SKILL.md.

Что делает drizzle-orm-d1?

Помогает агенту писать типизированные запросы к Cloudflare D1 через Drizzle ORM: схемы, связи, prepared statements, batch-операции и миграции Drizzle Kit.

Почему в D1 не работает db.transaction()?

D1 не поддерживает SQL BEGIN TRANSACTION, поэтому обычные транзакции падают с D1_ERROR. Скилл предлагает использовать db.batch([...]) вместо них.

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

SKILL.md · MIT
---
name: drizzle-orm-d1
description: "| Type-safe ORM for Cloudflare D1 databases using Drizzle. Use when: building D1 database schemas, writing type-safe SQL queries, managing migrations with Drizzle Kit, defining table relations, implementing prepared statements, using D1 batch API, or encountering D1_ERROR, transaction errors, foreign key constraint failures, or schema inference issues."

metadata:
  keywords:
    - drizzle orm
    - drizzle d1
    - type-safe sql
    - drizzle schema
    - drizzle migrations
    - drizzle kit
    - orm cloudflare
    - d1 orm
    - drizzle typescript
    - drizzle relations
    - drizzle transactions
    - drizzle query builder
    - schema definition
    - prepared statements
    - drizzle batch
    - migration management
    - relational queries
    - drizzle joins
    - D1_ERROR
    - BEGIN TRANSACTION d1
    - foreign key constraint
    - migration failed
    - schema not found
    - d1 binding error
    - schema design
    - database indexes
    - soft deletes
    - uuid primary keys
    - enum constraints
    - performance optimization
    - naming conventions
    - schema testing

license: MIT
---
# Drizzle ORM for Cloudflare D1

**Status**: Production Ready ✅
**Last Updated**: 2025-12-14
**Latest Version**: [email protected], [email protected]
**Dependencies**: cloudflare-d1, cloudflare-worker-base

---

## Quick Start (10 Minutes)

### 1. Install Drizzle

```bash
bun add drizzle-orm drizzle-kit
```

### 2. Configure Drizzle Kit

Create `drizzle.config.ts`:

```typescript
import { defineConfig } from 'drizzle-kit';

export default defineConfig({
  schema: './src/db/schema.ts',
  out: './migrations',
  dialect: 'sqlite',          // MANDATORY since drizzle-kit 0.21 (D1 = sqlite)
  driver: 'd1-http',          // D1 HTTP driver for remote migrations/Studio
  dbCredentials: {            // MANDATORY: drizzle-kit 0.30+ tightened zod validation
    accountId: process.env.CLOUDFLARE_ACCOUNT_ID!,
    databaseId: process.env.CLOUDFLARE_DATABASE_ID!,
    token: process.env.CLOUDFLARE_D1_TOKEN!,
  },
});
```

> **drizzle-kit 0.30/0.31 note**: `dialect` and `dbCredentials` are now strictly
> validated. A config that omits `dialect` or uses the old `connectionString`/
> `uri` keys will fail validation. For D1 use `dialect: 'sqlite'` +
> `driver: 'd1-http'` with `accountId`/`databaseId`/`token` (or wrangler-based
> credentials). The runtime `migrate()` signature in `drizzle-orm/<driver>/migrator`
> is unchanged from 0.36 → 0.45 (it changes only in 1.0-beta, which is out of
> scope for `^0.45`).

### 3. Define Schema

Create `src/db/schema.ts`:

```typescript
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
import { relations } from 'drizzle-orm';

export const users = sqliteTable('users', {
  id: integer('id').primaryKey({ autoIncrement: true }),
  email: text('email').notNull().unique(),
  name: text('name').notNull(),
  createdAt: integer('created_at', { mode: 'timestamp' }).$defaultFn(() => new Date()),
});

export const posts = sqliteTable('posts', {
  id: integer('id').primaryKey({ autoIncrement: true }),
  title: text('title').notNull(),
  content: text('content').notNull(),
  authorId: integer('author_id')
    .notNull()
    .references(() => users.id, { onDelete: 'cascade' }),
});

export const usersRelations = relations(users, ({ many }) => ({
  posts: many(posts),
}));
```

### 4. Generate & Apply Migrations

```bash
bunx drizzle-kit generate                           # Generate SQL
bunx wrangler d1 migrations apply my-database --local   # Apply local
bunx wrangler d1 migrations apply my-database --remote  # Apply prod
```

### 5. Query in Worker

```typescript
import { drizzle } from 'drizzle-orm/d1';
import { users } from './db/schema';
import { eq } from 'drizzle-orm';

export default {
  async fetch(request: Request, env: { DB: D1Database }): Promise<Response> {
    const db = drizzle(env.DB);
    const allUsers = await db.select().from(users).all();
    return Response.json(allUsers);
  },
};
```

---

## Critical Rules

### Always Do

| Rule | Why |
|------|-----|
| Use `drizzle-kit generate` for migrations | Never write SQL manually |
| Test migrations locally first | `--local` before `--remote` |
| Use `.get()` for single results | Returns first row or undefined |
| Use `db.batch()` for transactions | D1 doesn't support SQL BEGIN/COMMIT |
| Use `integer` with `mode: 'timestamp'` for dates | D1 has no native date type |
| Use `.$defaultFn()` for dynamic defaults | Not `.default()` for functions |

### Never Do

| Rule | Why |
|------|-----|
| Use SQL `BEGIN TRANSACTION` | D1 requires batch API (Error #1) |
| Mix `drizzle-kit migrate` and `wrangler apply` | Use Wrangler only |
| Use `drizzle-kit push` for production | Use `generate` + `apply` |
| Commit credentials in drizzle.config.ts | Use env vars |
| Use `.default()` for function calls | Use `.$defaultFn()` instead |

---

## Top 5 Critical Errors

| # | Error | Solution |
|---|-------|----------|
| 1 | `D1_ERROR: Cannot use BEGIN TRANSACTION` | Use `db.batch([...])` instead of `db.transaction()` |
| 2 | `FOREIGN KEY constraint failed` | Define cascading: `.references(() => users.id, { onDelete: 'cascade' })` |
| 3 | `env.DB is undefined` | Ensure binding in `wrangler.jsonc` matches `env.DB` |
| 4 | `No such module "wrangler"` | Use `import { drizzle } from 'drizzle-orm/d1'` |
| 5 | `Type instantiation excessively deep` | Use `InferSelectModel<typeof users>` for explicit types |

**See**: `references/error-catalog.md` for all 12 errors with complete solutions.

---

## Common Patterns Summary

| Pattern | Use Case | Template |
|---------|----------|----------|
| **CRUD Operations** | Basic database operations | `templates/basic-queries.ts` |
| **Relations & Joins** | Nested queries, manual joins | `templates/relations-queries.ts` |
| **Batch Operations** | Transactions (D1 batch API) | `templates/transactions.ts` |
| **Schema Design** | Naming, indexes, soft deletes | `references/schema-patterns.md` |

---

## Configuration Summary

| File | Purpose | Template |
|------|---------|----------|
| `drizzle.config.ts` | Drizzle Kit configuration | `templates/drizzle.config.ts` |
| `wrangler.jsonc` | D1 binding setup | `references/wrangler-setup.md` |
| `package.json` | npm scripts for migrations | `templates/package.json` |

**npm scripts:**
```json
{
  "db:generate": "drizzle-kit generate",
  "db:migrate:local": "wrangler d1 migrations apply my-database --local",
  "db:migrate:remote": "wrangler d1 migrations apply my-database --remote"
}
```

---

## Migration Workflow

| Step | Command | Notes |
|------|---------|-------|
| 1. Edit schema | Edit `src/db/schema.ts` | Make changes |
| 2. Generate | `npm run db:generate` | Creates SQL migration |
| 3. Test local | `npm run db:migrate:local` | Verify locally |
| 4. Deploy code | `npm run deploy` | Push to Cloudflare |
| 5. Apply prod | `npm run db:migrate:remote` | Apply migration |

**See**: `references/migration-workflow.md` for complete workflow.

---

## TypeScript Type Inference

```typescript
import { InferSelectModel, InferInsertModel } from 'drizzle-orm';
import { users } from './db/schema';

export type User = InferSelectModel<typeof users>;
export type NewUser = InferInsertModel<typeof users>;
```

---

## When to Load References

| Reference | Load When... |
|-----------|--------------|
| `references/error-catalog.md` | Debugging D1 errors, transaction failures, binding issues |
| `references/schema-patterns.md` | Designing schemas, naming conventions, indexes, soft deletes |
| `references/migration-workflow.md` | Setting up or troubleshooting migrations |
| `references/query-builder-api.md` | Complex queries, operators, joins syntax |
| `references/wrangler-setup.md` | Configuring wrangler.jsonc for D1 |
| `references/common-errors.md` | Quick error lookup |

---

## Bundled Resources

**Templates**: `basic-schema.ts`, `basic-queries.ts`, `transactions.ts`, `relations-queries.ts`, `prepared-statements.ts`, `drizzle.config.ts`, `package.json`

**References**: `error-catalog.md`, `schema-patterns.md`, `migration-workflow.md`, `query-builder-api.md`, `wrangler-setup.md`, `common-errors.md`, `links-to-official-docs.md`

---

## Dependencies

```json
{
  "dependencies": {
    "drizzle-orm": "^0.45.2"
  },
  "devDependencies": {
    "drizzle-kit": "^0.31.10"
  }
}
```

---

## Secure Installation

When installing Drizzle ORM and D1 driver packages, follow supply chain security best practices:

- **Block post-install scripts** — `npm config set ignore-scripts true` (or Bun: disabled by default)
- **Cooldown period** — Wait 7 days for new package versions to be vetted by the community
- **Audit before installing** — Run `socket package score npm <pkg>` or use `socket npm install <pkg>` to check packages

Load the `dependency-upgrade` skill for full security configuration including Socket CLI integration, cooldown setup, lockfile validation, and CI enforcement.

## Official Documentation

- **Drizzle ORM**: https://orm.drizzle.team/
- **Drizzle with D1**: https://orm.drizzle.team/docs/connect-cloudflare-d1
- **Drizzle Kit**: https://orm.drizzle.team/docs/kit-overview
- **GitHub**: https://github.com/drizzle-team/drizzle-orm

---

**Token Savings**: ~65% (comprehensive patterns in references)
**Error Prevention**: 100% (all 12 documented issues)
**Ready for production!** ✅

© secondsky · MIT · secondsky/claude-skills

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

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

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