Skip to content
Drizzleをベースにmodel駆動の開発を提供するデータベースフレームワーク
bun add kosame

DrizzleのTableに、Modelを重ねる

Modelクラスを足すだけで、Model駆動の開発を始められる。

Modelの定義
ts
import { Model } from "kosame";

export class User extends Model {
  static table = usersTable;
}

いまのDrizzleプロジェクトのまま使える

すでに書いたスキーマにそのまま適用できます。自分のdbをcreateContextに渡すだけで、必要なときはcontext.rawから素のDrizzleに戻れます。

  • schema.ts変更なし
  • db.ts変更なし
  • models/user.ts追加
  • data/context.ts追加

書き込みの前に、Modelで止める

ModelでbeforeCreate、beforeUpdate、beforeDeleteをオーバーライドし、例外を投げれば書き込みを中断できます。トランザクション内では、結果が決まった後にafterCommit、afterRollbackが呼ばれます。

Hooks
ts
export class User extends Model {
  static table = usersTable;

  override async beforeCreate() {
    if (!this.name.includes("kosame")) {
      throw new Error("Name must contain kosame");
    }
  }
}

素のDrizzleに近いコスト

PostgreSQLで素のDrizzleと比べた結果です。Kosameに専用のAPIがある操作は誤差の範囲で、往復が増える操作は、そのとおり遅くなります。

結果と計測方法
  • Drizzle
  • Kosame
  • Kosame(context.raw経由・2クエリ)
  • Prisma
主キーで取得
1.00×
0.94×
1.22×
主キーで取得 + include
1.00×
1.12×
1.25×
1件insert
1.00×
1.02×
1.15×
1件update
1.00×
1.63×
1.49×
20件のルート + リレーション(ルートごとに1回呼ぶ)
1.00×
5.31×
1.05×
1.72×

素のDrizzleを1.0としたときの、1操作あたりの時間です。短いほど速い。Apple M3、Bun 1.3、PostgreSQL 17での1回の計測です。

Drizzleが動くところで動く

いまお使いのDrizzleのドライバをインストールするだけです。

Dialectごとの注意点
  • PostgreSQLnode-postgres
  • MySQLmysql2
  • SQLitebetter-sqlite3 / libsql
  • Cloudflare D1未検証