Open4

CloudflareのWorkers & D1試してみる

Keisuke NumataKeisuke Numata

honoのセットアップ

  • インストール
$ npm i hono
  • 初期化
import { Hono } from 'hono'

const app = new Hono()

app.get('/', (c) => c.text('Hono! Hono!'))

export default app
  • デプロイして確認
Keisuke NumataKeisuke Numata

CloudFlare D1のセットアップ&素振り

データベースの初期化

D1用のCLIコマンドを叩いて出力されたtomlをwrangler.tomlに追加する

 wrangler d1 create my-db
🚧 D1 is currently in open alpha and is not recommended for production data and traffic.
Please report any bugs to https://github.com/cloudflare/wrangler2/issues/new/choose.
To request features, visit https://community.cloudflare.com/c/developers/d1.
To give feedback, visit https://discord.gg/cloudflaredev
✅ Successfully created DB 'my-db'!

Add the following to your wrangler.toml to connect to it from a Worker:

[[ d1_databases ]]
binding = "DB" # i.e. available in your Worker on env.DB
database_name = "my-db"
database_id = "XXX"

ローカルでSQLを実行してみる

  • ローカルにschema.sqlを作成
DROP TABLE IF EXISTS Customers;
CREATE TABLE Customers (CustomerID INT, CompanyName TEXT, ContactName TEXT, PRIMARY KEY (`CustomerID`));
INSERT INTO Customers (CustomerID, CompanyName, ContactName) VALUES (1, 'Alfreds Futterkiste', 'Maria Anders'), (4, 'Around the Horn', 'Thomas Hardy'), (11, 'Bs Beverages', 'Victoria Ashworth'), (13, 'Bs Beverages', 'Random Name');
  • wrangler CLIでschema.sqlを実行
$ wrangler d1 execute feedness --local --file=./schema.sql
  • wrangler CLIでデータが保存されたことを確認
$  wrangler d1 execute feedness --local --command='SELECT * FROM Customers'

┌────────────┬─────────────────────┬───────────────────┐
│ CustomerID │ CompanyName         │ ContactName       │
├────────────┼─────────────────────┼───────────────────┤
│ 1          │ Alfreds Futterkiste │ Maria Anders      │
├────────────┼─────────────────────┼───────────────────┤
│ 4          │ Around the Horn     │ Thomas Hardy      │
├────────────┼─────────────────────┼───────────────────┤
│ 11         │ Bs Beverages        │ Victoria Ashworth │
├────────────┼─────────────────────┼───────────────────┤
│ 13         │ Bs Beverages        │ Random Name       │
└────────────┴─────────────────────┴───────────────────┘

Workersから参照する

Workerのコードの以下を追加する

  • EnvにD1を追加
  • データを取得するエンドポイント追加
  • エンドポイント上でSQLを実行
export interface Env {
  DB: D1Database
}

const app = new Hono()

app.get('/api/beverages', async (c) => {
  const res = await c.env.DB.prepare(
    'SELECT * FROM Customers WHERE CompanyName = ?'
  )
    .bind('Bs Beverages')
    .all()
  return c.json(res.results)
})

参考

Keisuke NumataKeisuke Numata

D1のマイグレーション

参考: https://developers.cloudflare.com/d1/platform/migrations/

マイグレーションファイルの作成

$ wrangler d1 migrations create my_app "create_providers"

✅ Successfully created Migration '0000_create_providers.sql'!

The migration is available for editing here
/XXX/migrations/0000_create_providers.sql

マイグレーション一覧の確認

$  wrangler d1 migrations list my-app

🌀 Mapping SQL input into an array of statements
🌀 Parsing 1 statements
🚣 Executed 1 command in 0.3363149999640882ms
Migrations to be applied:
┌───────────────────────────┐
│ Name                      │
├───────────────────────────┤
│ 0000_create_providers.sql │
└───────────────────────────┘

マイグレーションの実行

$ wrangler d1 migrations apply feedness

Migrations to be applied:
┌───────────────────────────┐
│ Name                      │
├───────────────────────────┤
│ 0000_create_providers.sql │
└───────────────────────────┘
About to apply 1 migration(s)
Your database may not be available to serve requests during the migration, continue? (y/n)

🌀 Mapping SQL input into an array of statements
🌀 Parsing 2 statements
🚣 Executed 2 commands in 7.415894000791013ms
┌───────────────────────────┬────────┐
│ Name                      │ Status │
├───────────────────────────┼────────┤
│ 0000_create_providers.sql │ ✅       │
└───────────────────────────┴────────┘