Cloudflare D1 の ORM である "D1-Orm" を使う

D1-Orm とは

リポジトリ

github.com

ドキュメント

docs.interactions.rest

使い方

単純に SELECT するだけのコードを書いてみます。

Wrangler や Cloudflare Workers についての説明は省略します。

1. $ wrangler init する

まず $ wrangler init してサービスを作成します。

2. D1 データベースを作成する

$ wrangler d1 create DATABASE_NAME などの方法でデータベースを作成します。データベースを作成するとそのデータベースの ID が発行されます。

ID を含めたデータベースの情報を wrangler.toml に以下のように追記します。

[[ d1_databases ]]
binding = "DB" # i.e. available in your Worker on env.DB
database_name = "DATABASE_NAME"
database_id = "<Your Dartabase ID>"

3. データベースのマイグレーションやデータの投入などを行う

ここでは例として、users テーブルとそのデータを以下の SQL で作成します*1

CREATE TABLE Users (id INT, name TEXT, age INT, PRIMARY KEY (`id`));
INSERT INTO Users (id, name, age) VALUES (1, "Taro", 30),(3, "Hanako", 35),(5, "Tom", 40);

4. Workers サービスの index.ts を書く

D1-Orm を用いた処理を書きます。まずは d1-orm を npm なり yarn なり その他 なりでインストールします。

その後 src/index.ts にコードを書きます。ほぼサンプルのままです。

env.DB は先程の wrangler.toml の中で定義した DB という値がそれです*2

import { D1Orm, DataTypes, Model } from "d1-orm";
import type { Infer } from "d1-orm";

export interface Env {
  // from @cloudflare/workers-types
  DB: D1Database;
}

export default {
  async fetch(request: Request, env: Env) {
    const orm = new D1Orm(env.DB);
    const users = new Model(
      {
        D1Orm: orm,
        tableName: "users",
        primaryKeys: "id",
        autoIncrement: "id",
        uniqueKeys: [["id"]],
      },
      {
        id: {
          type: DataTypes.INTEGER,
        },
        name: {
          type: DataTypes.TEXT,
        },
        age: {
          type: DataTypes.INTEGER,
        },
      }
    );

    type User = Infer<typeof users>;

    const user = await users.First({
      where: {
        id: 1,
      },
    });

    return new Response(JSON.stringify(user));
  },
};

5. デプロイする

$ wrangler publish を実行してデプロイします。

6. アクセスする

割り当てた URL にアクセスすると、以下の JSON が返ってくるはずです。

{
  "id": 1,
  "name": "Taro",
  "age": 30
}

感想

D1 はまだアルファ版ですが、この段階で ORM が存在していることは期待が持てます。スキーマ管理やマイグレーション管理などのツールや環境が整うと、大きなインパクトがありそうです。

小規模のプロダクトやサービスならば、既存のフレームワークやアーキテクチャからの移行は十分考慮に値するのではという感想を持ちました*3

*1:https://dev.classmethod.jp/articles/cloudflare-d1-start/ より

*2:.env ファイルを別途用意する必要はない

*3:中規模のJAMstack なんかがちょうど良さそう

Powered by はてなブログ