编程 Headless ORM 是啥:Drizzle 做薄映射贴 SQL,0 依赖不藏查询

2026-09-09 00:03:45

从 data framework 到 Headless ORM:Drizzle 的取舍思路

Django/Spring 那套工具通常被叫做 ORM,但 Drizzle 认为这是基于旧命名的误称,这类工具应该叫 data framework

用 data framework 搭项目,实际上是“围绕它”搭项目,而不是“用它”搭项目。框架侵入你的项目结构,把 SQL 藏在 API 背后,结果就是双重学习曲线:既得懂 SQL 又得懂框架自己的查询语法。

Headless ORM 是另一种思路:薄薄一层映射,贴近 SQL 语法,类型安全,不强迫你改变项目结构,也没有运行时依赖。

Drizzle ORM 是 headless TypeScript ORM,~7.4KB min+gzip,0 运行时依赖,tree-shakeable。它 dialect-specific,直接支持 PostgreSQL/MySQL/SQLite/SingleStore/MSSQL/CockroachDB,走行业标准驱动,兼容 Neon、Turso、PlanetScale、Cloudflare D1 这类 serverless 存储。

schema 与查询

schema 在 TypeScript 中声明,用 pgTable 定义:

import { pgTable, integer, varchar } from 'drizzle-orm/pg-core';

export const countries = pgTable('countries', {
  id: integer('id').primaryKey(),
  name: varchar('name', { length: 256 }),
});

export const cities = pgTable('cities', {
  id: integer('id').primaryKey(),
  countryId: integer('country_id').references(() => countries.id),
  name: varchar('name', { length: 256 }),
});

schema 变更交给 Drizzle Kit 生成迁移文件,不需要在 JS 和 SQL 之间维护两份模型定义。

查询 API 有两种形式。SQL-like API 贴近原生 SQL:

import { eq } from 'drizzle-orm';
import { db } from './drizzle';
import { countries, cities } from './schema';

const result = await db
  .select()
  .from(countries)
  .leftJoin(cities, eq(cities.countryId, countries.id))
  .where(eq(countries.id, 10));

另一种是 relational Queries API,用 db.query 直接拉关联数据:

const users = await db.query.users.findMany({
  with: {
    posts: true,
  },
});

db.query 始终只生成一条 SQL,serverless 环境下不用担多节点 roundtrip 问题,这是它区别于某些嵌套加载会拆成多条查询的方案的地方。

Headless ORM 的核心判断是:把 SQL 藏在框架后面不等于消除复杂度,只是把复杂度从数据库移到了框架 API 上。Drizzle 选择薄映射、贴近 SQL、推给开发者去掌控查询,本质上是在用工程取舍推翻 data framework 的既有假设。

复制全文 生成海报 Headless ORM Drizzle TypeScript

推荐文章

程序员茄子在线接单