🔖

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