SuperAPI AI 工具集

drizzle-orm

编程与开发

查看项目

更新于 10-16 03:21

技能介绍

Drizzle ORM 是一个 TypeScript 优先的 SQL ORM,特点是零依赖、编译期类型安全和类 SQL 语法,并针对边缘运行时、无服务器环境与 PostgreSQL 做了优化。

用途 它用于在 TypeScript 项目中以类型安全的方式定义数据库结构、编写查询并管理迁移。当代码中导入 drizzle-orm、drizzle-kit 或 drizzle-orm/pg-core,或用户询问 Drizzle 相关问题时适用。

安装 核心 ORM 与 PostgreSQL 驱动: npm install drizzle-orm pg npm install -D drizzle-kit @types/pg 其他可选驱动: npm install postgres(postgres.js) npm install @neondatabase/serverless(Neon serverless) npm install @electric-sql/pglite(PGlite embedded)

数据库连接 支持直接使用连接字符串、连接池、传入 schema 以启用关系查询,以及 SSL 配置。示例: import { drizzle } from 'drizzle-orm/node-postgres'; const db = drizzle(process.env.DATABASE_URL!); 使用连接池: import { Pool } from 'pg'; const pool = new Pool({ connectionString: process.env.DATABASE_URL! }); const db = drizzle({ client: pool }); 带 schema: import * as schema from './schema'; const db = drizzle({ client: pool, schema }); 带 SSL: const db = drizzle({ connection: { connectionString: process.env.DATABASE_URL!, ssl: true } });

主要能力

  1. 表结构定义与类型推断:使用 pgTable 定义表,支持 integer、serial、text、varchar、boolean、timestamp、jsonb、uuid 等 PostgreSQL 列类型;通过 typeof users.$inferSelect 与 $inferInsert 推断查询与插入类型。
  2. 枚举与标识列:pgEnum 定义枚举;generatedAlwaysAsIdentity 与 generatedByDefaultAsIdentity 作为 serial 的替代。
  3. 索引与约束:支持 index、uniqueIndex、primaryKey、foreignKey、unique、check,以及复合主键与复合唯一约束(含 nullsNotDistinct)。
  4. 关系:relations 是应用层抽象,独立于数据库外键,用于启用 db.query 关系查询 API,支持一对多、多对多(经中间表)以及用 relationName 区分指向同一表的多重关系。
  5. 查询:SELECT(部分字段、过滤、排序分页、distinct、distinct on)、INSERT(单行/多行、returning、upsert、insert from select)、UPDATE(含 returning、UPDATE...FROM)、DELETE(含 returning)、各类连接(innerJoin、leftJoin、聚合、自连接别名)。
  6. 关系查询:db.query.users.findMany / findFirst,支持 with 嵌套、columns 选择、where、orderBy、limit。
  7. 事务:db.transaction 自动回滚、条件回滚 tx.rollback()、嵌套事务(savepoint),以及 PostgreSQL 隔离级别、访问模式与 deferrable 配置。
  8. 迁移(drizzle-kit):通过 drizzle.config.ts 配置 dialect、schema、out、dbCredentials;命令包括 generate、migrate、push、pull、generate --custom、check、studio;也支持程序化迁移 migrate(db, { migrationsFolder })。
  9. 其他:pgSchema 多 schema、pgView 与 pgMaterializedView 视图(含运行时 refreshMaterializedView 与 concurrently)、CTE($with,含带 INSERT 的 CTE)。

使用方式 典型流程是:安装依赖 → 配置数据库连接 → 用 pgTable 定义 schema 并推断类型 → 用 drizzle-kit generate 生成迁移、migrate 应用迁移(或 push 直接推送用于快速原型)→ 在代码中通过 db.select/insert/update/delete 或 db.query 执行查询,必要时使用事务。

适用场景 适合需要类型安全 SQL、贴近原生 SQL 控制力、面向 PostgreSQL 与边缘/无服务器部署的 TypeScript 项目;也适合需要迁移管理、关系查询、CTE、视图与物化视图的场景。

限制与注意事项 资料中列出的风险包括:JSON 列未使用 .$type<T>() 会丢失类型安全;用字符串拼接代替 sql 模板会有 SQL 注入风险;多步变更未放入 db.transaction() 可能导致部分写入;大表上 select() 不加 .limit() 可能耗尽内存;外键列与高频过滤列缺少索引会导致慢连接或全表扫描;serial() 在 PG 10+ 属于遗留写法,建议使用 generatedAlwaysAsIdentity()。

参考资料 资料还提到可进一步查阅的主题:PostgreSQL 迁移、进阶 schema、查询模式、性能,以及 Drizzle 与 Prisma 的对比。