データベース
Drizzle ORM によるデータベース設定と操作
概要
EasyStarter は Cloudflare D1(エッジ SQLite)と Drizzle ORM を使用して、型安全なデータベース操作を行います。
スキーマ定義
apps/server/src/db/schema/ でデータベーススキーマを定義:
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";
export const users = sqliteTable("users", {
id: text("id").primaryKey(),
email: text("email").notNull().unique(),
name: text("name"),
createdAt: integer("created_at", { mode: "timestamp" }).notNull(),
});データベースコマンド
| コマンド | 説明 |
|---|---|
pnpm db:generate | スキーマ変更からマイグレーションを生成 |
pnpm db:push | スキーマを D1 に直接プッシュ(開発のみ) |
pnpm db:migrate | マイグレーションを実行(本番環境) |
pnpm db:studio | Drizzle Studio(GUI)を開く |
データクエリ
選択
// すべてのユーザーを取得
const allUsers = await db.select().from(users);
// 条件付き
const activeUsers = await db.select().from(users).where(eq(users.status, "active"));
// ページネーション付き
const paginatedUsers = await db.select().from(users).limit(10).offset(0);挿入
await db.insert(users).values({
id: crypto.randomUUID(),
email: "user@example.com",
name: "山田太郎",
createdAt: new Date(),
});更新
await db.update(users).set({ name: "田中花子" }).where(eq(users.id, userId));削除
await db.delete(users).where(eq(users.id, userId));リレーション
テーブル間のリレーションを定義:
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],
}),
}));本番環境の設定
- Cloudflare Dashboard で D1 データベースを作成
wrangler.jsoncでデータベースバインディングを更新- マイグレーションを実行:
pnpm db:migrate