返回

集成Drizzle ORM到Cloudflare D1

DrizzleCloudflareD1ORMSQLite

选型

硬性要求:支持Cloudflare Worker/D1、SQLite

  • Prisma
    • github star 44k+
    • 语法熟悉,之前用过一段时间typeorm
    • 对d1的支持尚处于预览阶段
  • Drizzle
    • github star 30k+
    • 类sql语法
    • 原生支持cf d1

看了下cf d1文档里的推荐orm,这俩都在列。star数虽然Prisma比Drizzle更加热门, 但恐预览阶段有坑,果断选择Drizzle。

集成过程

基本上是按照文档一步步来,有问题就交给ai

参考文档:

安装配置啥的可以参考官方文档,这里直接从如何使用开始。

使用cli拉取已有的schema

drizzle-kit pull --config=drizzle.dev.config.ts

这会在./drizzle目录下生成schema文件.

import {sqliteTable, text} from "drizzle-orm/sqlite-core"
 
export const users = sqliteTable("users", {
  id: text().primaryKey(),
  name: text(),
  dateCreated: text("date_created").notNull(),
});

我们可以这样使用:

const db = drizzle(c.env.MY_DB)
 
await db.insert(users).values({
  id:'test',
  dateCreated: '2025-10-27 06:46:09',
})

也可以放到Hono的Variables里:

app.use(async (c,next) => {
	const db = drizzle(c.env.MY_DB)
	c.set('db',db)
	await next()
})

使用typeof users.$inferInsert获取自动推导的类型. 接下来可以改变dateCreated的类型、将name改成必填.

export type UsersInsert =
        Omit<typeof users.$inferInsert,
                "name" | "dateCreated"
        > & {
  name:string;
  dateCreated: Date;
};

然后可以封装一个insertUser方法,将UsersInsert作为参数类型.