Hono ใช้กับ D1 Database ของ Cloudflare

สร้าง project ด้วย bun ก่อนโดยใช้ bun create hono cfw-bun-hono-drizzle

    npm install -g wrangler
    bun create hono cfw-bun-hono-drizzle
    bun run dev
    bun run deploy

ติดตั้ง drizzle-orm และ drizzle-kit

    bun i drizzle-orm @libsql/client
    bun i drizzle-kit
    bunx wrangler d1 create cfw-bun-druzzle-d1

เอา config ที่ได้จาก command ใส่ใน workspace.toml หรือ wrangler.jsonc

เพิ่ม env จาก wrangler.jsonc


import { Hono } from 'hono'


export type Env = {
  MY_VAR: string;
};

const app = new Hono<{ Bindings: Env }>()

app.get('/', (c) => {
  return c.text(`Hello Hono! ${c.env.MY_VAR}`)
})

export default app

สร้าง file .dev.vars เพิ่ม env ตามที่ต้องการ

    PRIVATE=test
import { Hono } from 'hono'


export type Env = {
  MY_VAR: string;
  PRIVATE: string;
};

const app = new Hono<{ Bindings: Env }>()

app.get('/', (c) => {
  return c.text(`Hello Hono! ${c.env.MY_VAR} ${c.env.PRIVATE}`)
})

export default app

สร้าง file config drizzle drizzle.config.ts

import { defineConfig } from "drizzle-kit";
import type { Config } from "drizzle-kit";

export default defineConfig({
  schema: "./src/db/schema.ts",
  out: "./drizzle/migrations",
  dialect: "sqlite",
  driver: "d1-http",
} satisfies Config);

update script ใน package.json

"scripts": {
    "dev": "wrangler dev src/index.ts",
    "deploy": "wrangler deploy --minify src/index.ts",
    "db:generate": "bunx drizzle-kit generate",
    "db:up": "bunx drizzle-kit up"
},

สร้าง file db/schema.ts ใน src

import { sql } from "drizzle-orm";
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";

export const posts = sqliteTable("posts", {
  // id is set on insert, incrementing
  id: integer("id", { mode: "number" }).primaryKey({ autoIncrement: true }),

  // title of the blog post
  title: text("title", { length: 256 }).notNull(),

  // content of the blog post
  content: text("content", { length: 256 }).notNull(),

  // timestamp is set on insert
  timestamp: text("timestamp")
    .default(sql`CURRENT_TIMESTAMP`)
    .notNull(),
});

run command

    bun run db:generate
    bun add -d @cloudflare/workers-types
import { Hono } from 'hono';
import { eq } from 'drizzle-orm';
import { drizzle } from 'drizzle-orm/d1';
import type { D1Database } from '@cloudflare/workers-types';

import { posts } from './db/schema';

export type Env = {
  DB: D1Database;
};

const api = new Hono<{ Bindings: Env }>();
api
  .get('/posts', async (c) => {
    const db = drizzle(c.env.DB);
    const result = await db.select().from(posts).all();
    return c.json(result);
  })
  .get('/posts/:id', async (c) => {
    const db = drizzle(c.env.DB);
    const id = Number(c.req.param('id'));
    const result = await db.select().from(posts).where(eq(posts.id, id));
    return c.json(result);
  })
  .post('/posts', async (c) => {
    const db = drizzle(c.env.DB);
    const { title, content } = await c.req.json();
    const result = await db
      .insert(posts)
      .values({ title, content })
      .returning();
    return c.json(result);
  });

const app = new Hono();
app.route('/api', api);

export default app;
    bunx wrangler di execute cfw-bun-druzzle-d1 --local --file=./drizzle/migrations/0000_mixed_madame_web.sql
    bunx wrangler d1 execute cfw-bun-druzzle-d1 --remote --file=./drizzle/migrations/0000_mixed_madame_web.sql

deploy on cloudflare workers

    bun run deploy