d1-drizzle-schema — скилл для Claude Code: обзор и сетап
Генерирует схемы Drizzle ORM с учётом ограничений Cloudflare D1. Помогает описать таблицы, настроить миграции и задокументировать структуру базы данных.
npx skills add jezweb/claude-skills --skill d1-drizzle-schema -a claude-codeЧто делает d1-drizzle-schema
Скилл создаёт схему Drizzle ORM для Cloudflare D1, избегая расхождений между стандартным SQLite и средой Cloudflare. В D1 внешние ключи включены всегда. Нативных типов для дат и булевых значений нет, поэтому скилл прописывает поля через integer({ mode: 'boolean' }) и integer({ mode: 'timestamp' }), типизирует JSON как текст и собирает связи через relations.
Помимо кода таблиц генерируются типы $inferSelect и $inferInsert, конфиг drizzle.config.ts, команды миграций для wrangler и файл DATABASE_SCHEMA.md. Для массовых вставок скилл рассчитывает размер пачки по формуле Math.floor(100 / COLUMNS_PER_ROW).
Лимит в 100 связанных параметров в D1 сломает вставку нескольких десятков строк за раз, если забыть про батчинг. Генератор заранее закладывает деление записей на фрагменты при пакетной записи.
Какие задачи решает
- создать схему Drizzle ORM под специфику Cloudflare D1
- настроить хранение дат и булевых полей в формате целых чисел
- рассчитать размер пачки для массовой вставки с лимитом в 100 параметров
- сгенерировать скрипты миграций для wrangler в package.json
- составить документацию DATABASE_SCHEMA.md для проекта
Примеры запросов агенту
- Создай схему Drizzle для таблиц пользователей и организаций в Cloudflare D1
- Добавь связи и скрипты миграций wrangler для базы данных D1
- Напиши код массовой вставки данных в D1 с учётом лимита параметров
Как установить d1-drizzle-schema
1Через Skills CLI (Vercel)
npx skills add jezweb/claude-skills --skill d1-drizzle-schema -a claude-code2Вручную: положить файлы
~/.claude/skills/d1-drizzle-schema/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/d1-drizzle-schema/
1Через Skills CLI (Vercel)
npx skills add jezweb/claude-skills --skill d1-drizzle-schema -a codex2Вручную: положить файлы
.agents/skills/d1-drizzle-schema/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add jezweb/claude-skills --skill d1-drizzle-schema -a cursor2Вручную: положить файлы
.cursor/skills/d1-drizzle-schema/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install jezweb/claude-skills d1-drizzle-schema2Вручную: положить файлы
.github/skills/d1-drizzle-schema/SKILL.md1Через Skills CLI (Vercel)
npx skills add jezweb/claude-skills --skill d1-drizzle-schema -a gemini-cli2Командой платформы
gemini skills install https://github.com/jezweb/claude-skills --path archive/plugins/cloudflare/skills/d1-drizzle-schemaВручную: положить файлы
.devin/skills/d1-drizzle-schema/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add jezweb/claude-skills --skill d1-drizzle-schema -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Из того же набора54
Похожие
Рядом в теме «Данные и базы»
Все скиллы по теме «Данные и базы» →Вопросы о d1-drizzle-schema
Как установить d1-drizzle-schema в Claude Code?
Для установки выполните команду npx skills add jezweb/claude-skills --skill d1-drizzle-schema -a claude-code. Файл навыка сохранится по пути ~/.claude/skills/d1-drizzle-schema/SKILL.md.
Что делает скилл d1-drizzle-schema?
Он генерирует схемы таблиц Drizzle ORM, типы моделей, конфигурационный файл и скрипты миграций для Cloudflare D1. Скилл автоматически выставляет правильные режимы колонок для дат и булевых значений.
Как скилл решает проблему с лимитом параметров в Cloudflare D1?
D1 ограничивает число параметров запроса сотней. Скилл формирует цикл пакетной вставки, где размер батча рассчитывается делением 100 на количество колонок в строке.
Исходный текст
SKILL.md · MIT
---
name: d1-drizzle-schema
description: "Generate Drizzle ORM schemas for Cloudflare D1 databases with correct D1-specific patterns. Produces schema files, migration commands, type exports, and DATABASE_SCHEMA.md documentation. Handles D1 quirks: foreign keys always enforced, no native BOOLEAN/DATETIME types, 100 bound parameter limit, JSON stored as TEXT. Use when creating a new database, adding tables, or scaffolding a D1 data layer."
compatibility: claude-code-only
---
# D1 Drizzle Schema
Generate correct Drizzle ORM schemas for Cloudflare D1. D1 is SQLite-based but has important differences that cause subtle bugs if you use standard SQLite patterns. This skill produces schemas that work correctly with D1's constraints.
## Critical D1 Differences
| Feature | Standard SQLite | D1 |
|---------|-----------------|-----|
| Foreign keys | OFF by default | **Always ON** (cannot disable) |
| Boolean type | No | No — use `integer({ mode: 'boolean' })` |
| Datetime type | No | No — use `integer({ mode: 'timestamp' })` |
| Max bound params | ~999 | **100** (affects bulk inserts) |
| JSON support | Extension | **Always available** (json_extract, ->, ->>) |
| Concurrency | Multi-writer | **Single-threaded** (one query at a time) |
## Workflow
### Step 1: Describe the Data Model
Gather requirements: what tables, what relationships, what needs indexing. If working from an existing description, infer the schema directly.
### Step 2: Generate Drizzle Schema
Create schema files using D1-correct column patterns:
```typescript
import { sqliteTable, text, integer, real, index, uniqueIndex } from 'drizzle-orm/sqlite-core'
export const users = sqliteTable('users', {
// UUID primary key (preferred for D1)
id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),
// Text fields
name: text('name').notNull(),
email: text('email').notNull(),
// Enum (stored as TEXT, validated at schema level)
role: text('role', { enum: ['admin', 'editor', 'viewer'] }).notNull().default('viewer'),
// Boolean (D1 has no BOOL — stored as INTEGER 0/1)
emailVerified: integer('email_verified', { mode: 'boolean' }).notNull().default(false),
// Timestamp (D1 has no DATETIME — stored as unix seconds)
createdAt: integer('created_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),
updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),
// Typed JSON (stored as TEXT, Drizzle auto-serialises)
preferences: text('preferences', { mode: 'json' }).$type<UserPreferences>(),
// Foreign key (always enforced in D1)
organisationId: text('organisation_id').references(() => organisations.id, { onDelete: 'cascade' }),
}, (table) => ({
emailIdx: uniqueIndex('users_email_idx').on(table.email),
orgIdx: index('users_org_idx').on(table.organisationId),
}))
```
See [references/column-patterns.md](references/column-patterns.md) for the full type reference.
### Step 3: Add Relations
Drizzle relations are query builder helpers (separate from FK constraints):
```typescript
import { relations } from 'drizzle-orm'
export const usersRelations = relations(users, ({ one, many }) => ({
organisation: one(organisations, {
fields: [users.organisationId],
references: [organisations.id],
}),
posts: many(posts),
}))
```
### Step 4: Export Types
```typescript
export type User = typeof users.$inferSelect
export type NewUser = typeof users.$inferInsert
```
### Step 5: Set Up Drizzle Config
Copy [assets/drizzle-config-template.ts](assets/drizzle-config-template.ts) to `drizzle.config.ts` and update the schema path.
### Step 6: Add Migration Scripts
Add to `package.json`:
```json
{
"db:generate": "drizzle-kit generate",
"db:migrate:local": "wrangler d1 migrations apply DB --local",
"db:migrate:remote": "wrangler d1 migrations apply DB --remote"
}
```
**Always run on BOTH local AND remote before testing.**
### Step 7: Generate DATABASE_SCHEMA.md
Document the schema for future sessions:
- Tables with columns, types, and constraints
- Relationships and foreign keys
- Indexes and their purpose
- Migration workflow
## Bulk Insert Pattern
D1 limits bound parameters to 100. Calculate batch size:
```typescript
const BATCH_SIZE = Math.floor(100 / COLUMNS_PER_ROW)
for (let i = 0; i < rows.length; i += BATCH_SIZE) {
await db.insert(table).values(rows.slice(i, i + BATCH_SIZE))
}
```
## D1 Runtime Usage
```typescript
import { drizzle } from 'drizzle-orm/d1'
import * as schema from './schema'
// In Worker fetch handler:
const db = drizzle(env.DB, { schema })
// Query patterns
const all = await db.select().from(schema.users).all() // Array<User>
const one = await db.select().from(schema.users).where(eq(schema.users.id, id)).get() // User | undefined
const count = await db.select({ count: sql`count(*)` }).from(schema.users).get()
```
## Reference Files
| When | Read |
|------|------|
| D1 vs SQLite, JSON queries, limits | [references/d1-specifics.md](references/d1-specifics.md) |
| Column type patterns for Drizzle + D1 | [references/column-patterns.md](references/column-patterns.md) |
## Assets
| File | Purpose |
|------|---------|
| [assets/drizzle-config-template.ts](assets/drizzle-config-template.ts) | Starter drizzle.config.ts for D1 |
| [assets/schema-template.ts](assets/schema-template.ts) | Example schema with all common D1 patterns |
© jezweb · MIT · jezweb/claude-skills