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

bun-drizzle-integration — скилл для Claude Code: Drizzle ORM на Bun

Скилл подсказывает агенту, как связать Drizzle ORM с драйвером bun:sqlite: схема, миграции, CRUD и транзакции в одном месте.

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

Что делает bun-drizzle-integration

Скилл включается, когда вы пишете типизированный доступ к базе на Drizzle ORM поверх драйвера bun:sqlite. Внутри — готовые шаблоны: определение таблиц через sqliteTable, настройка drizzle.config.ts, генерация и применение миграций через drizzle-kit. Агент берёт оттуда примеры для вставки, выборки, обновления и удаления, включая onConflictDoNothing и upsert.

Отдельно разобраны связи между таблицами через relations, вложенные запросы с with, транзакции с откатом через tx.rollback() и подготовленные выражения. Есть таблица частых ошибок: SQLITE_CONSTRAINT, no such column, Cannot find module. Последняя лечится импортом из drizzle-orm/bun-sqlite — если взять драйвер откуда-то ещё, типы поедут.

Перед началом нужны пакеты: bun add drizzle-orm и bun add -D drizzle-kit. Скилл ссылается на файлы references/migrations.md и references/performance.md — их стоит подгружать для сложных миграций и работы с производительностью.

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

  • описать таблицы в schema.ts с типами и внешними ключами
  • сгенерировать и применить миграции через drizzle-kit
  • написать upsert с обновлением конфликтующей строки
  • обернуть несколько вставок в транзакцию с откатом
  • вытащить записи вместе со связанными строками одним запросом

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

  • Опиши таблицы users и posts в src/db/schema.ts через sqliteTable и свяжи их через relations
  • Настрой drizzle.config.ts для SQLite и сгенерируй миграцию командой bun drizzle-kit generate
  • Сделай вставку пользователя с onConflictDoUpdate по email и верни строку через .returning()

Как установить bun-drizzle-integration

1Через Skills CLI (Vercel)

npx skills add secondsky/claude-skills --skill bun-drizzle-integration -a claude-code

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

~/.claude/skills/bun-drizzle-integration/SKILL.md

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

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

Вопросы о bun-drizzle-integration

Как установить bun-drizzle-integration в Claude?

Выполните npx skills add secondsky/claude-skills --skill bun-drizzle-integration -a claude-code. После этого скилл лежит в ~/.claude/skills/bun-drizzle-integration/SKILL.md.

Что делает bun-drizzle-integration?

Даёт агенту шаблоны для работы с Drizzle ORM на драйвере bun:sqlite: схема, конфиг, миграции, CRUD, связи, транзакции и подготовленные выражения.

Какие пакеты нужны для работы скилла?

drizzle-orm как зависимость и drizzle-kit как dev-зависимость: bun add drizzle-orm и bun add -D drizzle-kit.

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

SKILL.md · MIT
---
name: bun-drizzle-integration
description: Use when integrating Drizzle ORM with Bun's SQLite driver for type-safe schema definitions and migrations.
metadata:
  version: "1.0.0"
license: MIT
---

# Bun Drizzle Integration

Drizzle ORM provides type-safe database access with Bun's SQLite driver.

## Quick Start

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

## Schema Definition

```typescript
// src/db/schema.ts
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";

export const users = sqliteTable("users", {
  id: integer("id").primaryKey({ autoIncrement: true }),
  name: text("name").notNull(),
  email: text("email").notNull().unique(),
  createdAt: integer("created_at", { mode: "timestamp" })
    .notNull()
    .default(sql`(unixepoch())`),
});

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

## Database Setup

```typescript
// src/db/index.ts
import { drizzle } from "drizzle-orm/bun-sqlite";
import { Database } from "bun:sqlite";
import * as schema from "./schema";

const sqlite = new Database("app.db");
export const db = drizzle(sqlite, { schema });
```

## Configuration

```typescript
// drizzle.config.ts
import type { Config } from "drizzle-kit";

export default {
  schema: "./src/db/schema.ts",
  out: "./drizzle",
  dialect: "sqlite",
  dbCredentials: {
    url: "./app.db",
  },
} satisfies Config;
```

## Migrations

```bash
# Generate migration
bun drizzle-kit generate

# Apply migrations
bun drizzle-kit migrate

# Push schema directly (dev only)
bun drizzle-kit push

# Open Drizzle Studio
bun drizzle-kit studio
```

## CRUD Operations

### Insert

```typescript
import { db } from "./db";
import { users, posts } from "./db/schema";

// Single insert
const user = await db.insert(users).values({
  name: "Alice",
  email: "[email protected]",
}).returning();

// Multiple insert
await db.insert(users).values([
  { name: "Bob", email: "[email protected]" },
  { name: "Charlie", email: "[email protected]" },
]);

// Insert or ignore
await db.insert(users)
  .values({ name: "Alice", email: "[email protected]" })
  .onConflictDoNothing();

// Upsert
await db.insert(users)
  .values({ name: "Alice", email: "[email protected]" })
  .onConflictDoUpdate({
    target: users.email,
    set: { name: "Alice Updated" },
  });
```

### Select

```typescript
import { eq, gt, like, and, or, desc, asc } from "drizzle-orm";

// All rows
const allUsers = await db.select().from(users);

// With conditions
const activeUsers = await db
  .select()
  .from(users)
  .where(eq(users.status, "active"));

// Multiple conditions
const filtered = await db
  .select()
  .from(users)
  .where(and(
    gt(users.age, 18),
    like(users.name, "%Alice%")
  ));

// Specific columns
const names = await db
  .select({ name: users.name, email: users.email })
  .from(users);

// Order and limit
const topUsers = await db
  .select()
  .from(users)
  .orderBy(desc(users.createdAt))
  .limit(10);

// First result
const first = await db.query.users.findFirst({
  where: eq(users.id, 1),
});
```

### Update

```typescript
// Update with condition
await db
  .update(users)
  .set({ name: "Alice Updated" })
  .where(eq(users.id, 1));

// Update multiple fields
await db
  .update(users)
  .set({
    name: "New Name",
    updatedAt: new Date(),
  })
  .where(eq(users.email, "[email protected]"));
```

### Delete

```typescript
// Delete with condition
await db.delete(users).where(eq(users.id, 1));

// Delete multiple
await db.delete(users).where(gt(users.createdAt, cutoffDate));
```

## Relations

```typescript
// schema.ts
import { relations } from "drizzle-orm";

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

export const postsRelations = relations(posts, ({ one }) => ({
  author: one(users, {
    fields: [posts.authorId],
    references: [users.id],
  }),
}));

// Query with relations
const usersWithPosts = await db.query.users.findMany({
  with: {
    posts: true,
  },
});

// Nested relations
const detailed = await db.query.users.findFirst({
  where: eq(users.id, 1),
  with: {
    posts: {
      with: {
        comments: true,
      },
    },
  },
});
```

## Transactions

```typescript
// Transaction
await db.transaction(async (tx) => {
  const [user] = await tx.insert(users)
    .values({ name: "Alice", email: "[email protected]" })
    .returning();

  await tx.insert(posts).values({
    title: "First Post",
    authorId: user.id,
  });
});

// Rollback on error
await db.transaction(async (tx) => {
  await tx.insert(users).values({ name: "Bob" });

  if (someCondition) {
    tx.rollback(); // Throws to rollback
  }

  await tx.insert(posts).values({ ... });
});
```

## Prepared Statements

```typescript
// Create prepared statement
const getUserById = db
  .select()
  .from(users)
  .where(eq(users.id, sql.placeholder("id")))
  .prepare();

// Execute with parameter
const user = await getUserById.execute({ id: 1 });

// Reuse for performance
for (const id of userIds) {
  const user = await getUserById.execute({ id });
  processUser(user);
}
```

## Raw SQL

```typescript
import { sql } from "drizzle-orm";

// Raw query
const result = await db.run(sql`
  UPDATE users SET last_login = ${new Date()} WHERE id = ${userId}
`);

// In select
const users = await db.select({
  name: users.name,
  upperName: sql<string>`UPPER(${users.name})`,
}).from(users);

// Raw expressions in where
await db.select().from(users).where(
  sql`${users.age} > 18 AND ${users.status} = 'active'`
);
```

## Column Types Reference

```typescript
import {
  sqliteTable,
  text,
  integer,
  real,
  blob,
  numeric,
} from "drizzle-orm/sqlite-core";

const example = sqliteTable("example", {
  // Integer
  id: integer("id").primaryKey(),
  age: integer("age"),

  // Text
  name: text("name"),
  status: text("status", { enum: ["active", "inactive"] }),

  // Real (float)
  price: real("price"),

  // Blob
  data: blob("data", { mode: "buffer" }),

  // Boolean (stored as integer)
  active: integer("active", { mode: "boolean" }),

  // Timestamp (stored as integer)
  createdAt: integer("created_at", { mode: "timestamp" }),
  updatedMs: integer("updated_ms", { mode: "timestamp_ms" }),

  // JSON (stored as text)
  metadata: text("metadata", { mode: "json" }),
});
```

## Common Errors

| Error | Cause | Fix |
|-------|-------|-----|
| `SQLITE_CONSTRAINT` | FK/unique violation | Check constraints |
| `no such column` | Schema mismatch | Run migrations |
| `Cannot find module` | Missing driver | Use `drizzle-orm/bun-sqlite` |
| Type mismatch | Wrong column type | Check schema definition |

## When to Load References

Load `references/migrations.md` when:
- Complex migration scenarios
- Migration squashing
- Database seeding

Load `references/performance.md` when:
- Query optimization
- Indexing strategies
- Connection pooling

© secondsky · MIT · secondsky/claude-skills

Похожие скиллы

Все скиллы по теме «Данные и базы» →
drizzle-orm Mindrally Скилл задаёт агенту правила разработки на Drizzle ORM: схема как код, типы из таблиц, запросы и миграции. CX Codex +1 1 000установок d1-drizzle-schema jezweb Генерирует схемы Drizzle ORM с учётом ограничений Cloudflare D1. Помогает описать таблицы, настроить миграции и задокументировать структуру базы данных. CX Codex +1 1 700установок drizzle-best-practices Marc A. Maceira Zayas Скилл подсказывает агенту, как правильно писать схемы, запросы и связи в Drizzle ORM на PostgreSQL. Пригодится, когда проект на TypeScript и Postgres. CX Codex +1 685установок drizzle-migrations bobmatnyc Скилл задаёт порядок работы с базой в TypeScript: сначала SQL-миграция, потом схема. Пригодится, когда схема меняется в нескольких окружениях. CX Codex +1 1 300установок drizzle-orm-patterns giuseppe-trisciuoglio Помогает писать типобезопасные схемы, запросы и миграции на Drizzle ORM. Пригодится при работе с таблицами, связями и транзакциями. CX Codex +1 5 400установок bun brianlovin Переключает агента на среду Bun вместо привычных Node.js и npm. Настраивает команды запуска, встроенные базы данных и сервер без внешних пакетов. CX Codex +1 2 800установок

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

root-cause-tracing Ведёт агента назад по стеку вызовов, пока не найдётся исходный триггер ошибки. Пригодится, когда падение случается глубоко в коде, а не на входе. CX Codex +1 426установок recommendation-engine Скилл для построения рекомендательных систем: коллаборативная фильтрация, матричная факторизация, гибридные подходы. Пригодится, когда нужны персональные подборки товаров или контента. CX Codex +1 423установок api-response-optimization Скилл для ИИ-кодинга, который подсказывает, как уменьшить размер ответов API, включить кэширование и сжатие. Пригодится, когда эндпоинты отвечают медленно. CX Codex +1 422установок api-filtering-sorting Скилл для ИИ-агента, который помогает собрать фильтрацию и сортировку в API: разбор query-параметров, валидация, защита от инъекций. CX Codex +1 418установок drizzle-orm-d1 Скилл для работы с Cloudflare D1 через Drizzle ORM: схемы, типизированные запросы, миграции Drizzle Kit и разбор типовых ошибок D1. CX Codex +1 416установок 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установок

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

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