Drizzle ORMにおけるJSONとJSONBカラム

SQLのJSONおよびJSONBカラム型を、型安全なjson()とjsonb()ビルダーを使用してDrizzle ORMスキーマに変換します。PostgreSQL、MySQL、SQLiteのアプローチを解説します。

Dialect-Specific

詳細な説明

DrizzleにおけるJSONカラム

JSONカラムは現代のデータベースでますます一般的になっています。Drizzleは、TypeScriptの型システムと統合するダイアレクト固有のビルダーを提供します。

PostgreSQL: json()とjsonb()

PostgreSQLはJSON(テキストとして保存)とJSONB(バイナリで保存、インデックス対応)を区別します。Drizzleはそれぞれに別のビルダーを提供します:

CREATE TABLE products (
  id SERIAL PRIMARY KEY,
  attributes JSON,
  metadata JSONB NOT NULL DEFAULT '{}'
);
import { json, jsonb, pgTable, serial } from "drizzle-orm/pg-core";

export const products = pgTable("products", {
  id: serial("id").primaryKey(),
  attributes: json("attributes"),
  metadata: jsonb("metadata").notNull().default({}),
});

MySQL: json()

MySQLは単一のJSON型を持ち、バイナリストレージ(PostgreSQLのJSONBに類似)を使用します:

CREATE TABLE settings (
  id INT AUTO_INCREMENT PRIMARY KEY,
  config JSON NOT NULL
);
import { json, mysqlTable, serial } from "drizzle-orm/mysql-core";

export const settings = mysqlTable("settings", {
  id: serial("id").primaryKey(),
  config: json("config").notNull(),
});

SQLite: text()

SQLiteにはネイティブのJSON型がありません。JSONデータはTEXTとして保存され、SQLiteはクエリ用のJSON関数を提供します。コンバーターはSQLiteのJSONカラムをtext()にマッピングします:

import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core";

export const settings = sqliteTable("settings", {
  id: integer("id").primaryKey(),
  config: text("config").notNull(),
});

Drizzleによる型安全なJSON

Drizzleの強みの一つは、JSONカラムに型を付ける能力です。変換後、TypeScriptジェネリクスを追加できます:

interface ProductAttributes {
  color: string;
  size: string;
  weight: number;
}

export const products = pgTable("products", {
  id: serial("id").primaryKey(),
  attributes: json("attributes").$type<ProductAttributes>(),
  metadata: jsonb("metadata").$type<Record<string, unknown>>().notNull().default({}),
});

.$type<T>()メソッドは、JSONカラムの読み書き時に完全なTypeScriptオートコンプリートと型チェックを提供します。

JSONBインデックス

PostgreSQLスキーマにJSONBカラムのGINインデックスが含まれている場合、これらは生のSQLマイグレーションで別途処理する必要があります。Drizzleのスキーマ定義はGINインデックス構文を直接サポートしていません。

ユースケース

データベースが柔軟なスキーマ、APIレスポンス、設定オブジェクト用にJSON/JSONBカラムに構造化データを保存しており、これらを型安全なDrizzle ORM定義に変換したい場合。

試してみる — SQL to Drizzle Schema

フルツールを開く