バックエンドを構築

まずは、Cloudflare Workers
にHono
を導入します。
Hono
から導入して、Cloudflare Workers
を選択します。
次に、Cloudflare D1
を導入します。
最後に、Drizzle ORM
を導入します。
解説動画
YouTubeに解説動画を公開しています。 こちらもあわせて、ぜひご覧ください。
Hono
を導入する
https://hono.dev/docs/getting-started/cloudflare-workers
1. プロジェクトを作成する
以下のコマンドを実行して、プロジェクトを作成します。
bun create hono@latest apps/backend
Which template do you want to use?
は、cloudflare-workers
を選択します。
Do you want to install project dependencies?
は、yes
を選択します。
Which package manager do you want to use?
は、bun
を選択します。
2. 動作を確認する
bun workspace
で各プロジェクトの簡易サーバーを立ち上げるには、bun run
の次に、オプションfilter
を使って、プロジェクト名を指定します。
このコマンドを使えば、わざわざ各プロジェクトのディレクトリに移動しなくても、簡易サーバーを立ち上げることができます。
bun run --filter backend dev
立ち上がったら、http://localhost:8787
が表示されるので、コピーします。
Postmanを開いて、コピーしたhttp://localhost:8787
を貼り付けて、リクエストを送信します。
Hello Hono!
が表示されました。
どうして、Hello Hono!
と表示されたのか、index.ts
を確認してみましょう。
index.ts
を開きます。
import { Hono } from "hono"; const app = new Hono(); app.get("/", (c) => { return c.text("Hello Hono!"); }); export default app;
text
プロパティで文字列Hello Hono!
を渡して、レスポンスを返すようにしています。
元に戻しておきます。
Cloudflare D1
を導入する
https://developers.cloudflare.com/d1/get-started/
expense-tracker-db
という名前でデータベースを作成します。
npx wrangler d1 create expense-tracker-db
コマンドを実行します。 実行すると、以下の設定のコードが表示されるので、選択してコピーします。
:::message alert
database_id
を知られると、悪用されてしまうので、扱いには注意してください。
:::
"d1_databases": [ { "binding": "DB", "database_name": "expense-tracker-db", "database_id": "1d0e3d88-1001-4beb-ad24-0ef25f2ab76b" } ]
wrangler.jsonc
を開いて、コメントをすべて選択して、コピーしたコードを上書きします。
$schema
プロパティが、警告になっています。
これは、bun workspace
を使っているため、node_modules
のパスがづれているからです。
パスを修正して、警告を解消します。
- "$schema": "node_modules/wrangler/config-schema.json", + "$schema": "../../node_modules/wrangler/config-schema.json",
Drizzle ORM
を導入する
https://orm.drizzle.team/docs/connect-cloudflare-d1
1. packagesをインストールする
パッケージをインストールする場合、インストールするプロジェクトのディレクトリに移動する必要があります。
cd apps/backend
drizzle-orm
とdrizzle-kit
をインストールします。
bun add drizzle-orm bun add -D drizzle-kit
2. wrangler.jsonc
に以下の設定を追加する
データベースを作成した際の設定に以下の設定を追加します。
migrations_dir = "drizzle/migrations"
これは、マイグレーションファイルを参照するために、保存されるパスを指定しています。 マイグレーションファイルは、テーブルを作成するSQLファイルのことを指します。 そして、SQLファイルを作成することをマイグレーションするといいます。
3. drizzle.config.ts
を作成する
drizzle.config.ts
は、drizzle-kit
を使うための設定を行います。
import { defineConfig } from "drizzle-kit"; export default defineConfig({ dialect: "sqlite", schema: "./drizzle/schema", out: "./drizzle/migrations", });
dialect
プロパティは、データベースの種類を指定します。
schema
プロパティは、テーブルのスキーマを定義したファイルのパスを指定します。
out
プロパティは、マイグレーションファイルを保存するパスを指定します。
4. categories_table
テーブルスキーマを作成する
categories_table
テーブルのカラムは以下の通りです。
カラム名 | 型 | 説明 |
---|---|---|
id | INTEGER | 主キー(自動増加) |
name | TEXT | カテゴリ名(例:食費、交通費、給料 など) |
drizzle.config.ts
のschema
プロパティで設定したdrizzle/schema
ディレクトリの中にcategories.ts
を作成します。
import { sqliteTable, integer, text } from "drizzle-orm/sqlite-core"; export const categoriesTable = sqliteTable("categories_table", { id: integer("id").primaryKey(), name: text("name").notNull(), });
sqliteTable
関数を使って、categories_table
テーブルを作成しています。
そして、引数categoriesTable
に格納しています。
sqliteTable
関数は、drizzle-orm/sqlite-core
パッケージの関数です。
sqliteTable
関数の引数には、テーブル名とカラムを指定します。
id
カラムは、integer型で、主キーであるため、primaryKey
関数を使って、主キーを設定しています。
name
カラムは、text型で、notNull
関数を使うことで、必ず値を持つようにしています。
5. schema
をマイグレーションする
drizzle-kit generate
を使って、schema
を定義したcategories.ts
から、マイグレーションします。
マイグレーションすると、categories_table
テーブルを作成するSQLファイルが生成されます。
cd apps/backend npx drizzle-kit generate
実行すると、drizzle/migrations
ディレクトリに0000_skinny_master_mold.sql
ファイルが生成されました。
これは、drizzle.config.ts
のout
プロパティで設定したパスになります。
drizzle
ディレクトリ、migrations
ディレクトリと開いていくと、SQLファイルが作成されていることがわかります。
SQLファイル名は、自動的に命名されて作成されます。
:::message alert SQLファイル名は、自動的に命名されます。 適宜、作成されたファイル名に変更してください。 :::
Cloudflare D1
にテーブルを作成する
Cloudflare D1にテーブルを作成します。
wrangler d1 execute
を使って、drizzle/migrations/0000_skinny_master_mold.sql
ファイルを実行します。
オプション--local
を指定すると、ローカル環境でデータベースが作成されて、そこにテーブルが作成されます。
逆に、本番環境にテーブルを作成する場合は、--remote
を指定します。
npx wrangler d1 execute expense-tracker-db --local --file=./drizzle/migrations/0000_skinny_master_mold.sql
作成したテーブルを確認します。 確認するために、VS Codeの拡張機能を使います。
https://marketplace.visualstudio.com/items?itemName=alexcvzz.vscode-sqlite
もちろん、Cursorでも使えますので、安心してください。
コマンドパレットを開いて、sqlite
と入力してください。
候補から、SQLite: Open Database
を選択します。
apps/backend/.wrangler/state/v3/d1/
のパスのファイルを選択します。
エクスプローラーのnotepadの下に、SQLITE EXPROLERが表示されました。
クリックすると、categories_table
が作成されていることがわかります。
Show Tablesをクリックして、categories_table
が表示されます。
ただ、まだデータがないので、何も表示されません。
categories_table
をクリックすると、テーブルのカラムが表示されます。
テーブルにデータを挿入する
テーブルにデータを挿入します。
これも拡張機能を使います。
まずは、insert文を作成してもらいます。
insert
と入力すると、オートコンプリートで作成してくれました。
insert into categories_table (id, name) values (1, 'test');
これを、切り取ります。
コマンドパレットを開いて、sqlite
と入力してください。
候補から、SQLite: Quick Query
を選択します。
apps/backend/.wrangler/state/v3/d1/
のパスのファイルを選択します。
先ほどのinsert文をペーストして、実行します。
Show Tablesをクリックすると、categories_table
に登録されたデータが表示されました。