drizzle-orm-d1 — скилл для Claude Code: Drizzle ORM и Cloudflare D1
Скилл для работы с Cloudflare D1 через Drizzle ORM: схемы, типизированные запросы, миграции Drizzle Kit и разбор типовых ошибок D1.
npx skills add secondsky/claude-skills --skill drizzle-orm-d1 -a claude-codeЧто делает 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-code2Вручную: положить файлы
~/.claude/skills/drizzle-orm-d1/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/drizzle-orm-d1/
1Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill drizzle-orm-d1 -a codex2Вручную: положить файлы
.agents/skills/drizzle-orm-d1/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill drizzle-orm-d1 -a cursor2Вручную: положить файлы
.cursor/skills/drizzle-orm-d1/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install secondsky/claude-skills drizzle-orm-d12Вручную: положить файлы
.github/skills/drizzle-orm-d1/SKILL.md1Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill drizzle-orm-d1 -a gemini-cli2Командой платформы
gemini skills install https://github.com/secondsky/claude-skills --path plugins/drizzle-orm-d1/skills/drizzle-orm-d1Вручную: положить файлы
.devin/skills/drizzle-orm-d1/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill drizzle-orm-d1 -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Из того же набора89
Похожие
Рядом в теме «Данные и базы»
Все скиллы по теме «Данные и базы» →Вопросы о 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