Drizzle ORMにおけるJSONとJSONBカラム
SQLのJSONおよびJSONBカラム型を、型安全なjson()とjsonb()ビルダーを使用してDrizzle ORMスキーマに変換します。PostgreSQL、MySQL、SQLiteのアプローチを解説します。
詳細な説明
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定義に変換したい場合。