Drizzle ORM入門
近年、効率的なデータベース操作を実現するためのツールとして注目を集めているのがDrizzle ORMです。本記事では、Drizzle ORM の基本的な概要からセットアップ方法、そして実際のデータベース操作までを解説します。
そもそも ORM とは
ORM(Object-Relational Mapping)とは、オブジェクト指向プログラミングとリレーショナルデータベースとの間の橋渡しを行う技術です。ORM を使用することで、データベースのテーブルをプログラム内のクラスとして扱い、SQL を直接書くことなくデータベース操作を行うことが可能になります。これにより、コードの可読性が向上し、開発効率が大幅にアップします。
Drizzle の良さ
Drizzle ORM は、以下のような特徴を持つ最新の ORM ツールです:
- 型安全性:TypeScript との高い互換性により、コンパイル時に型エラーを検出できます。
- SQL ライク:文法を SQL に似せており、SQL の知識がある人であれば簡単に使うことができます。
- 軽量かつ高速:不要な機能を排除し、パフォーマンスを最適化しています。
個人的には、新たに文法を学ぶ必要がないのが大きいですね。
Drizzle のセットアップ
Drizzle ORM をプロジェクトに導入する手順は非常にシンプルです。以下に基本的なセットアップ方法を紹介します。
1. Drizzle のインストール
まず、Drizzle ORM と PostgreSQL 用のパッケージをプロジェクトにインストールします。
npm install drizzle-orm drizzle-orm-postgres
2. PostgreSQL への接続設定
次に、PostgreSQL に接続するための設定を行います。以下は接続設定のサンプルコードです。
import { drizzle } from "drizzle-orm";
import { postgres } from "drizzle-orm/postgres";
const connection = postgres({
user: "your_username",
host: "localhost",
database: "my_database",
password: "your_password",
port: 5432,
});
const db = drizzle(connection);
接続設定のポイント
- ユーザー名、ホスト、データベース名、パスワード、ポート番号を自身の環境に合わせて設定します。
-
drizzle
関数を用いて、PostgreSQL への接続を確立します。
テーブルの定義
Drizzle ORM では、クラスベースでテーブルを定義します。以下はUsers
テーブルの定義例です。
import { Table, Column, Serial, Varchar, Int } from "drizzle-orm";
class Users extends Table {
id = new Serial();
name = new Varchar(100);
age = new Int();
email = new Varchar(100).unique();
}
const users = new Users();
SQL でのテーブル作成との比較
上記のクラス定義は、以下の SQL 文と同等の意味を持ちます。
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
age INT,
email VARCHAR(100) UNIQUE
);
クラスベースの定義により、データベーススキーマとコードの整合性を保ちやすくなります。
データベース操作
Drizzle ORM を使用すると、CRUD(Create, Read, Update, Delete)操作を直感的に行うことができます。以下に基本的なデータベース操作の例を示します。
insert
データの挿入:新しいユーザーをUsers
テーブルに挿入する方法です。
await db.insert(users).values({
name: "田中太郎",
age: 28,
email: "tanaka@example.com",
});
対応する SQL:
INSERT INTO users (name, age, email)
VALUES ('田中太郎', 28, 'tanaka@example.com');
select
データの取得:条件に合致するユーザーを取得する方法です。
const result = await db.select(users).where(users.age.gt(25));
対応する SQL:
SELECT * FROM users WHERE age > 25;
update
データの更新:特定のユーザーの年齢を更新する方法です。
await db.update(users).set({ age: 29 }).where(users.name.eq("田中太郎"));
対応する SQL:
UPDATE users
SET age = 29
WHERE name = '田中太郎';
delete
データの削除:条件に合致するユーザーを削除する方法です。
await db.delete(users).where(users.age.lt(20));
対応する SQL:
DELETE FROM users
WHERE age < 20;
実用例: URL パラメータを利用したデータ取得
Drizzle ORM を実際のアプリケーションでどのように活用するか、具体的な実用例を紹介します。以下のコードは、React の useParams フックを使用して URL から layoutId を取得し、それを基にデータベースから該当するレイアウト情報を取得する例です。
import { useParams } from "react-router-dom";
import { eq } from "drizzle-orm/expressions";
import { layoutTable } from "./tables";
const { layoutId } = useParams();
const id = Number(layoutId);
const layouts = await db
.select()
.from(layoutTable)
.where(eq(layoutTable.layoutId, id));
コード解説
1. URL パラメータの取得
const { layoutId } = useParams();
useParams フックを使用して、URL から layoutId パラメータを取得します。
2. パラメータの型変換
const id = Number(layoutId);
取得した layoutId は文字列型なので、Number 関数を使用して数値型に変換します。データベースの layoutId フィールドが数値型である場合、この変換は必須です。
3. データベースからのデータ取得
const layouts = await db
.select()
.from(layoutTable)
.where(eq(layoutTable.layoutId, id));
db.select()でデータの選択を開始します。
.from(layoutTable)で対象となるテーブルを指定します。
.where(eq(layoutTable.layoutId, id))で条件を設定し、layoutId が指定した id と等しいレコードを取得します。
この操作は非同期処理となるため、await を使用して結果を待ちます。
もちろん、クライアント側でデータフェッチする時にも使えます。
以上です。
Discussion