Drizzle ORM
PetraDBは@petradb/drizzleパッケージを通じてDrizzle ORMドライバーを提供します。カスタムPostgreSQLダイアレクトドライバーを実装しており、DrizzleがPostgreSQLダイアレクトのSQLを生成し、PetraDBがワイヤプロトコルなしでインプロセスで実行します。このドライバーはdrizzle-orm/node-postgresと完全な機能パリティを持ち、db.transaction()、すべてのミューテーションでのreturning()、リレーショナルクエリをサポートします。
インストール
Section titled “インストール”npm install @petradb/drizzle drizzle-orm @petradb/engineセットアップ
Section titled “セットアップ”import { Session } from "@petradb/engine";import { drizzle } from "@petradb/drizzle";
const session = new Session({ storage: "memory" });const db = drizzle(session);ストレージモード
Section titled “ストレージモード”// インメモリ(デフォルト)new Session({ storage: "memory" })
// ファイルベースの永続ストレージnew Session({ storage: "persistent", path: "./mydb.petra" })スキーマ定義
Section titled “スキーマ定義”DrizzleのpgTableを使用してテーブルを定義します。
import { pgTable, serial, text, integer, boolean } from "drizzle-orm/pg-core";
const users = pgTable("users", { id: serial("id").primaryKey(), name: text("name").notNull(), email: text("email").notNull(), age: integer("age"), active: boolean("active").default(true),});セッション経由でテーブルを作成するか、drizzle-kit generate + migrate()でマイグレーションを使用します。
await session.execute(` CREATE TABLE users ( id SERIAL PRIMARY KEY, name TEXT NOT NULL, email TEXT NOT NULL, age INTEGER, active BOOLEAN DEFAULT true )`);Insert
Section titled “Insert”// 単一行await db.insert(users).values({ name: "Alice", email: "alice@example.com", age: 30,});
// 複数行await db.insert(users).values([ { name: "Bob", email: "bob@example.com", age: 25 }, { name: "Charlie", email: "charlie@example.com", age: 35 },]);
// returning付きconst [inserted] = await db .insert(users) .values({ name: "Diana", email: "diana@example.com", age: 28 }) .returning();console.log(inserted.id); // 自動生成されたserialSelect
Section titled “Select”import { eq, gt } from "drizzle-orm";
// すべての行const allUsers = await db.select().from(users);
// WHERE句const alice = await db.select().from(users).where(eq(users.name, "Alice"));
// 条件const older = await db.select().from(users).where(gt(users.age, 28));
// 特定のカラムconst names = await db .select({ name: users.name, email: users.email }) .from(users);
// Limitconst first = await db.select().from(users).limit(1);Update
Section titled “Update”// 行の更新await db.update(users).set({ age: 31 }).where(eq(users.name, "Alice"));
// returning付きconst [updated] = await db .update(users) .set({ active: false }) .where(eq(users.name, "Bob")) .returning();Delete
Section titled “Delete”// 行の削除await db.delete(users).where(eq(users.name, "Charlie"));
// returning付きconst [deleted] = await db .delete(users) .where(eq(users.name, "Diana")) .returning();トランザクション
Section titled “トランザクション”Drizzleのdb.transaction() APIで自動コミット/ロールバックを使用します。
// 自動コミットconst result = await db.transaction(async (tx) => { const [inserted] = await tx .insert(users) .values({ name: "Eve", email: "eve@example.com", age: 22 }) .returning(); return inserted;});
// エラー時の自動ロールバックawait db.transaction(async (tx) => { await tx.insert(users).values({ name: "Frank", email: "frank@example.com" }); throw new Error("something went wrong"); // Frankは挿入されません — トランザクションがロールバックされます});
// 明示的ロールバックawait db.transaction(async (tx) => { await tx.insert(users).values({ name: "Grace", email: "grace@example.com" }); tx.rollback(); // TransactionRollbackErrorをスロー});db.$sessionを使用して手動トランザクション制御も可能です。
await db.$session.execute("BEGIN");await db.insert(users).values({ name: "Hank", email: "hank@example.com" });await db.$session.execute("COMMIT");型マッピング
Section titled “型マッピング”PetraDBはネイティブJS型を返すため、文字列変換は不要です。
| Drizzle型 | PetraDBカラム | JS型 |
|---|---|---|
serial() | SERIAL | number |
integer() | INTEGER | number |
text() | TEXT | string |
boolean() | BOOLEAN | boolean |
numeric() | NUMERIC | string |
NULLableカラムは値がない場合にnullを返します。
マイグレーション
Section titled “マイグレーション”Drizzle Kitマイグレーションをmigrate()関数で適用します。
import { migrate } from "@petradb/drizzle";
await migrate(db, { migrationsFolder: "./drizzle" });これはdrizzle-kit generateで生成されたマイグレーションジャーナルとSQLファイルを読み取り、順番に実行し、適用されたマイグレーションをdrizzle.__drizzle_migrationsテーブル(自動作成)で追跡します。
一般的なワークフロー:
# スキーマ変更からマイグレーションを生成npx drizzle-kit generate
# 起動時にマイグレーションを適用import { Session } from "@petradb/engine";import { drizzle, migrate } from "@petradb/drizzle";
const session = new Session({ storage: "memory" });const db = drizzle(session);
await migrate(db, { migrationsFolder: "./drizzle" });// テーブルが作成されました — 通常通りdbを使用できますクリーンアップ
Section titled “クリーンアップ”await session.close();