D1-Orm とは
リポジトリ
ドキュメント
使い方
単純に 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 なんかがちょうど良さそう