drizzle-orm-d1 について
Cloudflare D1 プロジェクト向けの Drizzle ORM スキルです。初期設定、マイグレーション、データ投入に加え、D1 固有の制約や一般的な問題の回避策を扱います。
主な機能
- 01Drizzle ORM と D1 の設定
- 02マイグレーションの生成と適用
- 03初期データやテストデータの投入
- 04D1 の制約と問題の回避策
- 05クエリ構築とログ記録の解説
活用シーン
- 01D1 プロジェクトで Drizzle ORM を導入
- 02リモート適用前にマイグレーションをローカル検証
- 03トランザクション、外部キー、一括挿入の問題を調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jezweb/ claude-skills --skill drizzle-orm-d1インストール後、Claude Code で/drizzle-orm-d1を入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.md.claude-plugin/plugin.jsonagents/drizzle-migrate.mdcommands/db-init.mdmigrate.mdseed.mdreferences/common-errors.mdlinks-to-official-docs.mdmigration-workflow.mdquery-builder-api.mdschema-patterns.mdwrangler-setup.mdrules/drizzle-orm-d1.mdscripts/check-versions.shtemplates/basic-queries.tsclient.tscloudflare-worker-integration.tsdrizzle.config.tspackage.jsonprepared-statements.tsrelations-queries.tsschema.tstransactions.tstemplates/migrations/0001_example.sql詳細
Cloudflare D1 向け Drizzle ORM
ステータス:本番環境対応済み ✅ 最終更新日:2026-02-03
コマンド
| コマンド | 目的 |
|---|---|
/db-init | D1 で Drizzle ORM をセットアップします(スキーマ、設定、マイグレーション) |
/migrate | データベースのマイグレーションを生成して適用します |
/seed | 初期データまたはテストデータをデータベースに投入します |
| 最新バージョン:[email protected], [email protected], [email protected] | |
| 依存関係:cloudflare-d1, cloudflare-worker-base |
クイックスタート(5 分)
# 1. Install
npm install drizzle-orm
npm install -D drizzle-kit
# 2. Configure drizzle.config.ts
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
schema: './src/db/schema.ts',
out: './migrations',
dialect: 'sqlite',
driver: 'd1-http',
dbCredentials: {
accountId: process.env.CLOUDFLARE_ACCOUNT_ID!,
databaseId: process.env.CLOUDFLARE_DATABASE_ID!,
token: process.env.CLOUDFLARE_D1_TOKEN!,
},
});
# 3. Configure wrangler.jsonc
{
"d1_databases": [{
"binding": "DB",
"database_name": "my-database",
"database_id": "your-database-id",
"migrations_dir": "./migrations" // CRITICAL: Points to Drizzle migrations
}]
}
# 4. Define schema (src/db/schema.ts)
import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';
export const users = sqliteTable('users', {
id: integer('id').primaryKey({ autoIncrement: true }),
email: text('email').notNull().unique(),
createdAt: integer('created_at', { mode: 'timestamp' }).$defaultFn(() => new Date()),
});
# 5. Generate & apply migrations
npx drizzle-kit generate
npx wrangler d1 migrations apply my-database --local # Test first
npx wrangler d1 migrations apply my-database --remote # Then production
# 6. Query in Worker
import { drizzle } from 'drizzle-orm/d1';
import { users } from './db/schema';
const db = drizzle(env.DB);
const allUsers = await db.select().from(users).all();
D1 固有の重要なルール
✅ トランザクションには db.batch() を使用します - D1 は SQL BEGIN/COMMIT をサポートしていません(Issue #1 を参照)
✅ まずローカルでマイグレーションをテストします - 常に --remote の前に --local を実行します
✅ 日付には mode: 'timestamp' を指定した integer を使用します - D1 にはネイティブの日付型がありません
✅ 動的なデフォルト値には .$defaultFn() を使用します - 関数には .default() を使用しません
✅ wrangler.jsonc に migrations_dir を設定します - ./migrations を指定します
❌ SQL の BEGIN TRANSACTION は使用しないでください - D1 では batch API が必要です
❌ 本番環境で drizzle-kit push を使用しないでください - generate と apply を使用します
❌ wrangler.toml と wrangler.jsonc を併用しないでください - wrangler.jsonc のみを使用します
Drizzle Kit ツール
Drizzle Studio(ビジュアルデータベースブラウザー)
npx drizzle-kit studio
# Opens http://local.drizzle.studio
# For remote D1 database
npx drizzle-kit studio --port 3001
機能:
- テーブルとデータを視覚的に確認できます
- レコードをインラインで編集できます
- カスタム SQL クエリを実行できます
- スキーマのリレーションシップを確認できます
マイグレーションコマンド
| コマンド | 目的 |
|---|---|
drizzle-kit generate | スキーマの変更から SQL マイグレーションを生成します |
drizzle-kit push | スキーマを直接プッシュします(開発専用。本番環境では使用しません) |
drizzle-kit pull | 既存のデータベースをイントロスペクトして Drizzle スキーマを生成します |
drizzle-kit check | マイグレーションの整合性を検証します(競合状態) |
drizzle-kit up | マイグレーションのスナップショットを最新の形式にアップグレードします |
# Introspect existing D1 database
npx drizzle-kit pull
# Validate migrations haven't collided
npx drizzle-kit check
高度なクエリパターン
動的なクエリ構築
.$dynamic() を使って条件に応じたクエリを構築します。
import { eq, and, or, like, sql } from 'drizzle-orm';
// Base query
function getUsers(filters: { name?: string; email?: string; active?: boolean }) {
let query = db.select().from(users).$dynamic();
if (filters.name) {
query = query.where(like(users.name, `%${filters.name}%`));
}
if (filters.email) {
query = query.where(eq(users.email, filters.email));
}
if (filters.active !== undefined) {
query = query.where(eq(users.active, filters.active));
}
return query;
}
// Usage
const results = await getUsers({ name: 'John', active: true });
Upsert(競合時に挿入または更新)
import { users } from './schema';
// Insert or ignore if exists
await db.insert(users)
.values({ id: 1, email: '[email protected]', name: 'Test' })
.onConflictDoNothing();
// Insert or update specific fields on conflict
await db.insert(users)
.values({ id: 1, email: '[email protected]', name: 'Test' })
.onConflictDoUpdate({
target: users.email, // Conflict on unique email
set: {
name: sql`excluded.name`, // Use value from INSERT
updatedAt: new Date(),
},
});
⚠️ D1 の Upsert に関する注意点: 対象は一意カラムまたは主キーである必要があります。
ロギングによるデバッグ
import { drizzle } from 'drizzle-orm/d1';
// Enable query logging
const db = drizzle(env.DB, { logger: true });
// Custom logger
const db = drizzle(env.DB, {
logger: {
logQuery(query, params) {
console.log('SQL:', query);
console.log('Params:', params);
},
},
});
// Get SQL without executing (for debugging)
const query = db.select().from(users).where(eq(users.id, 1));
const sql = query.toSQL();
console.log(sql.sql, sql.params);
既知の問題の防止
このスキルは、文書化された 18 件の問題を防止します。
Issue #1:D1 のトランザクションエラー
エラー:D1_ERROR: Cannot use BEGIN TRANSACTION
出典:https://github.com/drizzle-team/drizzle-orm/issues/4212
原因:Drizzle は SQL の BEGIN TRANSACTION を使用しますが、D1 では代わりに batch API が必要です。
防止策:db.transaction() の代わりに db.batch([...]) を使用します
Issue #2:外部キー制約エラー
エラー:FOREIGN KEY constraint failed: SQLITE_CONSTRAINT
出典:https://github.com/drizzle-team/drizzle-orm/issues/4089
原因:Drizzle は PRAGMA foreign_keys = OFF; を使用するため、マイグレーションが失敗します。
防止策:カスケードを設定して外部キーを定義します:.references(() => users.id, { onDelete: 'cascade' })
Issue #3:本番環境でのモジュールインポートエラー
エラー:Error: No such module "wrangler"
出典:https://github.com/drizzle-team/drizzle-orm/issues/4257
原因:実行時コードで wrangler パッケージからインポートすると、本番環境で失敗します。
防止策:import { drizzle } from 'drizzle-orm/d1' を使用し、wrangler からはインポートしないでください
Issue #4:D1 バインディングが見つからない
エラー:TypeError: Cannot read property 'prepare' of undefined
原因:コード内のバインディング名が wrangler.jsonc の設定と一致していません。
防止策:wrangler.jsonc の "binding": "DB" がコード内の env.DB と一致していることを確認します
Issue #5:マイグレーションの適用エラー
エラー:Migration failed to apply: near "...": syntax error
原因:構文エラー、またはマイグレーションの適用順序が正しくありません。
防止策:まずローカルでテストし(--local)、生成された SQL を確認し、必要に応じて再生成します
Issue #6:スキーマの TypeScript 型推論エラー
エラー:Type instantiation is excessively deep and possibly infinite
原因:リレーションシップに複雑な循環参照があります。
防止策:InferSelectModel<typeof users> を使用して明示的に型を指定します
Issue #7:プリペアドステートメントのキャッシュに関する問題
エラー:クエリ結果が古い、または正しくない
理由:D1 は従来の SQLite のようにプリペアドステートメントをキャッシュしません。
防止策:必ず .all() または .get() メソッドを使用し、リクエスト間でステートメントを再利用しないでください。
Issue #8:トランザクションのロールバックパターン
エラー:エラー発生時にトランザクションがロールバックされない 理由:D1 の batch API は従来のロールバックをサポートしていません。 防止策:try/catch で手動クリーンアップを行うエラーハンドリングを実装してください。
Issue #9:TypeScript の Strict モードエラー
エラー:strict: true による型エラー
理由:Drizzle の型は緩い場合があります。
防止策:Promise<User | undefined> のように明示的な戻り値の型を使用してください。
Issue #10:Drizzle の設定が見つからない
エラー:Cannot find drizzle.config.ts
理由:ファイルの場所または名前が間違っています。
防止策:ファイルはプロジェクトのルートに drizzle.config.ts という名前で配置する必要があります。
Issue #11:リモート D1 とローカル D1 の混同
エラー:変更が開発環境または本番環境に反映されない
理由:誤ったデータベースにマイグレーションを適用しています。
防止策:開発環境には --local、本番環境には --remote を使用してください。
Issue #12:wrangler.toml と wrangler.jsonc
エラー:設定が認識されない
理由:TOML と JSON の形式が混在しています。
防止策:一貫して wrangler.jsonc を使用してください(コメントをサポートしています)。
Issue #13:一括挿入における D1 の 100 パラメーター制限
エラー:too many SQL variables at offset
出典:drizzle-orm#2479、Cloudflare D1 Limits
発生する理由:Cloudflare D1 では、クエリごとにバインドできるパラメーター数が 100 個に制限されています。複数の行を挿入する際、Drizzle は自動的に分割しません。(rows × columns) > 100 の場合、クエリは失敗します。
防止策:手動で分割するか、自動分割パターンを使用してください。
例 - 失敗するケース:
// 35 rows × 3 columns = 105 parameters → FAILS
const books = Array(35).fill({}).map((_, i) => ({
id: i.toString(),
title: "Book",
author: "Author",
}));
await db.insert(schema.books).values(books);
// Error: too many SQL variables at offset
解決策 - 手動で分割:
async function batchInsert<T>(
db: any,
table: any,
items: T[],
chunkSize = 32
) {
for (let i = 0; i < items.length; i += chunkSize) {
await db.insert(table).values(items.slice(i, i + chunkSize));
}
}
await batchInsert(db, schema.books, books);
解決策 - 列数に応じて自動分割:
const D1_MAX_PARAMETERS = 100;
async function autochunk<T extends Record<string, unknown>, U>(
{ items, otherParametersCount = 0 }: {
items: T[];
otherParametersCount?: number;
},
cb: (chunk: T[]) => Promise<U>,
) {
const chunks: T[][] = [];
let chunk: T[] = [];
let chunkParameters = 0;
for (const item of items) {
const itemParameters = Object.keys(item).length;
if (chunkParameters + itemParameters + otherParametersCount > D1_MAX_PARAMETERS) {
chunks.push(chunk);
chunkParameters = itemParameters;
chunk = [item];
continue;
}
chunk.push(item);
chunkParameters += itemParameters;
}
if (chunk.length) chunks.push(chunk);
const results: U[] = [];
for (const c of chunks) {
results.push(await cb(c));
}
return results.flat();
}
// Usage
const inserted = await autochunk(
{ items: books },
(chunk) => db.insert(schema.books).values(chunk).returning()
);
注:これは drizzle-seed にも影響します。シードサイズを制限するには、seed(db, schema, { count: 10 }) を使用してください。
Issue #14:Batch API で findFirst を使用すると、undefined ではなくエラーが返される
エラー:TypeError: Cannot read properties of undefined (reading '0')
出典:drizzle-orm#2721
発生する理由:D1 でバッチ操作に findFirst を使用した際、結果が見つからないと、Drizzle は null や undefined を返さずに TypeError をスローします。これにより、偽値の戻り値を想定するエラーハンドリングのパターンが機能しなくなります。
防止策:pnpm patch を使って D1 セッションハンドラーを修正するか、バッチ操作で findFirst を使用しないでください。
例 - 失敗するケース:
// Works fine - returns null/undefined when not found
const result = await db.query.table.findFirst({
where: eq(schema.table.key, 'not-existing'),
});
// Throws TypeError instead of returning undefined
const [result] = await db.batch([
db.query.table.findFirst({
where: eq(schema.table.key, 'not-existing'),
}),
]);
// Error: TypeError: Cannot read properties of undefined (reading '0')
解決策 - drizzle-orm にパッチを適用:
# Create patch with pnpm
pnpm patch drizzle-orm
次に、node_modules/drizzle-orm/d1/session.js を編集します:
// In mapGetResult method, add null check:
if (!result) {
return undefined;
}
if (this.customResultMapper) {
return this.customResultMapper([result]);
}
回避策 - バッチで findFirst を使用しない:
// Instead of batch with findFirst, use separate queries
const result = await db.query.table.findFirst({
where: eq(schema.table.key, key),
});
Issue #15:D1 は生成列をサポートしていない
エラー:生成列を定義するスキーマ API がない 出典:drizzle-orm#4538、D1 Generated Columns 発生する理由:Cloudflare D1 は、JSON やその他の列から値を抽出または計算する生成列をサポートしており、インデックスを付けるとクエリのパフォーマンスを大幅に向上できます。Drizzle ORM にはこれらの列を定義するスキーマ API がないため、ユーザーは生の SQL を記述する必要があります。 防止策:生成列には生の SQL によるマイグレーションを使用してください。
例 - D1 でサポートされている機能:
-- D1 supports this, but Drizzle has no JS equivalent
CREATE TABLE products (
id INTEGER PRIMARY KEY,
data TEXT,
price REAL GENERATED ALWAYS AS (json_extract(data, '$.price')) STORED
);
CREATE INDEX idx_price ON products(price);
回避策 - 生の SQL を使用:
import { sql } from 'drizzle-orm';
// Current workaround - raw SQL only
await db.run(sql`
CREATE TABLE products (
id INTEGER PRIMARY KEY,
data TEXT,
price REAL GENERATED ALWAYS AS (json_extract(data, '$.price')) STORED
)
`);
// Or in migration file (migrations/XXXX_add_generated.sql)
CREATE INDEX idx_price ON products(price);
注:これは既知の制限であり、バグではありません。機能はリクエストされていますが、まだ実装されていません。
Issue #16:マイグレーションジェネレーターが CASCADE DELETE によるデータ損失を密かに引き起こす
エラー:マイグレーション中に関連データが密かに削除されます
出典:drizzle-orm#4938
発生する理由:Drizzle はテーブル再作成の前に PRAGMA foreign_keys=OFF を生成しますが、Cloudflare D1 はこのプラグマを無視します。CASCADE DELETE が引き続き実行され、関連データがすべて破棄されます。
予防策:バックアップ/復元パターンを使って、危険なマイグレーションを手動で書き換えます
⚠️ 重大な警告:本番環境でデータが永久に失われる可能性があります。
発生する状況:
テーブルの再作成が必要なスキーマ変更(列の追加/削除、型の変更など)を行うと、テーブルが DROP され、再作成されます。外部キーがこのテーブルを参照しており、onDelete: "cascade" が設定されている場合、関連データがすべて削除されます。
例 - 危険なマイグレーション:
// Schema with cascade relationships
export const account = sqliteTable("account", {
accountId: integer("account_id").primaryKey(),
name: text("name"),
});
export const property = sqliteTable("property", {
propertyId: integer("property_id").primaryKey(),
accountId: integer("account_id").references(() => account.accountId, {
onDelete: "cascade" // ⚠️ CASCADE DELETE
}),
});
// Change account schema (e.g., add a column)
// npx drizzle-kit generate creates:
// DROP TABLE account; -- ⚠️ Silently destroys ALL properties via cascade!
// CREATE TABLE account (...);
安全なマイグレーションパターン:
-- Manually rewrite migration to backup related data
PRAGMA foreign_keys=OFF; -- D1 ignores this, but include anyway
-- 1. Backup related tables
CREATE TABLE backup_property AS SELECT * FROM property;
-- 2. Drop and recreate parent table
DROP TABLE account;
CREATE TABLE account (
account_id INTEGER PRIMARY KEY,
name TEXT,
-- new columns here
);
-- 3. Restore related data
INSERT INTO property SELECT * FROM backup_property;
DROP TABLE backup_property;
PRAGMA foreign_keys=ON;
検出方法: 適用する前に、生成されたマイグレーションを必ず確認してください。次の項目を探します:
- 外部キー参照があるテーブルに対する
DROP TABLE文 onDelete: "cascade"のリレーションシップがあるテーブル
回避策:
- オプション 1:マイグレーションを手動で書き換えます(最も安全)
- オプション 2:スキーマ変更では
"cascade"ではなくonDelete: "set null"を使用します - オプション 3:マイグレーション中、一時的に外部キーを削除します
再現方法: https://github.com/ZerGo0/drizzle-d1-reprod
影響:better-auth の v1.3.7 以降へのマイグレーション、および外部キーを持つすべての D1 スキーマに影響します。
Issue #17:D1 のバッチ処理で sql テンプレートを使うと TypeError が発生する
エラー:TypeError: Cannot read properties of undefined (reading 'bind')
出典:drizzle-orm#2277
発生する理由:db.batch() 内で sql テンプレートリテラルを使用すると、TypeError が発生します。同じ SQL でも、バッチ処理の外であれば問題なく動作します。
予防策:バッチ処理では sql テンプレートの代わりにクエリビルダーを使用します
例 - 失敗するケース:
const upsertSql = sql`insert into ${schema.subscriptions}
(id, status) values (${id}, ${status})
on conflict (id) do update set status = ${status}
returning *`;
// Works fine
const [subscription] = await db.all<Subscription>(upsertSql);
// Throws TypeError: Cannot read properties of undefined (reading 'bind')
const [[batchSubscription]] = await db.batch([
db.all<Subscription>(upsertSql),
]);
解決策 - クエリビルダーを使用する:
// Use Drizzle query builder instead
const [result] = await db.batch([
db.insert(schema.subscriptions)
.values({ id, status })
.onConflictDoUpdate({
target: schema.subscriptions.id,
set: { status }
})
.returning()
]);
回避策 - ネイティブ D1 に変換する:
import { SQLiteSyncDialect } from 'drizzle-orm/sqlite-core';
const sqliteDialect = new SQLiteSyncDialect();
const upsertQuery = sqliteDialect.sqlToQuery(upsertSql);
const [result] = await D1.batch([
D1.prepare(upsertQuery.sql).bind(...upsertQuery.params),
]);
Issue #18:Drizzle 1.0 のネストされたマイグレーションが Wrangler に見つからない
エラー:マイグレーションがエラーメッセージなしで適用されずに終わります
出典:drizzle-orm#5266
発生する理由:Drizzle 1.0 beta はネストされたマイグレーションフォルダーを生成しますが、wrangler d1 migrations apply は設定されたディレクトリ直下のファイルだけを探します。
予防策:生成後スクリプトでマイグレーションをフラット化します
マイグレーション構造の問題:
# Drizzle 1.0 beta generates this:
migrations/
20260116123456_random/
migration.sql
20260117234567_another/
migration.sql
# But wrangler expects this:
migrations/
20260116123456_random.sql
20260117234567_another.sql
検出方法:
npx wrangler d1 migrations apply my-db --remote
# Output: "No migrations found" (even though migrations exist)
解決策 - 生成後スクリプト:
// scripts/flatten-migrations.ts
import fs from 'fs/promises';
import path from 'path';
const migrationsDir = './migrations';
async function flattenMigrations() {
const entries = await fs.readdir(migrationsDir, { withFileTypes: true });
for (const entry of entries) {
if (entry.isDirectory()) {
const sqlFile = path.join(migrationsDir, entry.name, 'migration.sql');
const flatFile = path.join(migrationsDir, `${entry.name}.sql`);
// Move migration.sql out of folder
await fs.rename(sqlFile, flatFile);
// Remove empty folder
await fs.rmdir(path.join(migrationsDir, entry.name));
console.log(`Flattened: ${entry.name}/migration.sql → ${entry.name}.sql`);
}
}
}
flattenMigrations().catch(console.error);
package.json との統合:
{
"scripts": {
"db:generate": "drizzle-kit generate",
"db:flatten": "tsx scripts/flatten-migrations.ts",
"db:migrate": "npm run db:generate && npm run db:flatten && wrangler d1 migrations apply my-db"
}
}
修正されるまでの回避策: マイグレーションを生成した後は、必ずフラット化スクリプトを実行してください:
npx drizzle-kit generate
tsx scripts/flatten-migrations.ts
npx wrangler d1 migrations apply my-db --remote
状況:flat: true 設定オプションの追加がリクエストされています(未実装)。
バッチ API パターン(D1 トランザクション)
// ❌ DON'T: Use traditional transactions (fails with D1_ERROR)
await db.transaction(async (tx) => { /* ... */ });
// ✅ DO: Use D1 batch API
const results = await db.batch([
db.insert(users).values({ email: '[email protected]', name: 'Test' }),
db.insert(posts).values({ title: 'Post', content: 'Content', authorId: 1 }),
]);
// With error handling
try {
await db.batch([...]);
} catch (error) {
console.error('Batch failed:', error);
// Manual cleanup if needed
}
バンドルされたリソースの使用
スクリプト(scripts/)
check-versions.sh - パッケージのバージョンが最新かどうかを確認します
./scripts/check-versions.sh
出力:
Checking Drizzle ORM versions...
✓ drizzle-orm: 0.44.7 (latest)
✓ drizzle-kit: 0.31.5 (latest)
リファレンス(references/)
特定の詳細情報が必要な場合は、Claude に以下を読み込ませてください:
- wrangler-setup.md - Wrangler の設定ガイド完全版(ローカルとリモート、環境変数)
- schema-patterns.md - D1/SQLite のすべての列型、制約、インデックス
- migration-workflow.md - マイグレーションのワークフロー完全版(生成、テスト、適用)
- query-builder-api.md - Drizzle クエリビルダー API リファレンス完全版
- common-errors.md - 18 件すべてのエラーと詳細な解決策
- links-to-official-docs.md - 公式ドキュメントへのリンク集
読み込みが必要な場合:
- ユーザーが特定の列型について尋ねた場合 → schema-patterns.md を読み込みます
- ユーザーがマイグレーションエラーに遭遇した場合 → migration-workflow.md と common-errors.md を読み込みます
- ユーザーが API リファレンスの完全版を必要とする場合 → query-builder-api.md を読み込みます
依存関係
必須:
[email protected]- ORM ランタイム[email protected]- マイグレーション用 CLI ツール
任意:
[email protected]- ローカルでの SQLite 開発用@cloudflare/[email protected]- TypeScript 型定義
スキル:
- cloudflare-d1 - D1 データベースの作成と生 SQL クエリ
- cloudflare-worker-base - Worker プロジェクトの構成と Hono のセットアップ
公式ドキュメント
- Drizzle ORM: https://orm.drizzle.team/
- Drizzle と D1: https://orm.drizzle.team/docs/connect-cloudflare-d1
- Drizzle Kit: https://orm.drizzle.team/docs/kit-overview
- Drizzle のマイグレーション: https://orm.drizzle.team/docs/migrations
- GitHub: https://github.com/drizzle-team/drizzle-orm
- Cloudflare D1: https://developers.cloudflare.com/d1/
- Wrangler D1 コマンド: https://developers.cloudflare.com/workers/wrangler/commands/#d1
- Context7 ライブラリ:
/drizzle-team/drizzle-orm-docs
パッケージバージョン(2026-01-06 に確認済み)
{
"dependencies": {
"drizzle-orm": "^0.45.1"
},
"devDependencies": {
"drizzle-kit": "^0.31.8",
"@cloudflare/workers-types": "^4.20260103.0",
"better-sqlite3": "^12.5.0"
}
}
本番環境での例
このスキルは、次の本番環境でのパターンに基づいています。
- Cloudflare Workers + D1:サーバーレスのエッジデータベース
- Drizzle ORM:本番アプリで使用される型安全な ORM
- エラー:0 件(既知の問題 18 件すべてを予防)
- 検証:✅ 完全なブログの例(ユーザー、投稿、コメント)
最終確認日:2026-01-20 | スキルバージョン:3.1.0 | 変更点:重要な調査結果を 6 件追加(100 パラメーター制限、カスケードによるデータ損失、ネストされたマイグレーション、バッチ API のエッジケース、生成列の制限)
トークン削減:手動セットアップと比べて約 60% エラー予防:100%(既知の問題 18 件すべてを文書化し、予防) 本番環境で利用可能です! ✅