Drizzle ORM

类 SQL 语法的 TypeScript ORM - 类型安全、零依赖、serverless 就绪

TL;DR

是什么:具有类 SQL 语法和零依赖的 TypeScript ORM。

为什么用:类型安全、轻量、类 SQL API、优秀 DX、serverless 就绪。

Quick Start

安装

npm install drizzle-orm
npm install -D drizzle-kit
npm install pg  # 或 better-sqlite3, mysql2

定义 schemasrc/db/schema.ts):

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

export const users = pgTable('users', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
  email: text('email').notNull().unique(),
});

连接和查询

import { drizzle } from 'drizzle-orm/node-postgres';
import { Pool } from 'pg';
import { users } from './schema';

const pool = new Pool({ connectionString: process.env.DATABASE_URL });
const db = drizzle(pool);

const allUsers = await db.select().from(users);

Cheatsheet

命令描述
npx drizzle-kit generate生成迁移
npx drizzle-kit migrate运行迁移
npx drizzle-kit push推送 schema(无迁移)
npx drizzle-kit studio打开 Drizzle Studio

Gotchas

Schema 定义

import { pgTable, serial, text, integer, boolean, timestamp } from 'drizzle-orm/pg-core';

export const users = pgTable('users', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
  email: text('email').notNull().unique(),
  age: integer('age'),
  isActive: boolean('is_active').default(true),
  createdAt: timestamp('created_at').defaultNow(),
});

export const posts = pgTable('posts', {
  id: serial('id').primaryKey(),
  title: text('title').notNull(),
  content: text('content'),
  authorId: integer('author_id').references(() => users.id),
});

CRUD 操作

import { eq, and, or, like } from 'drizzle-orm';

// 创建
await db.insert(users).values({
  name: 'John',
  email: '[email protected]'
});

// 读取
const allUsers = await db.select().from(users);
const user = await db.select().from(users).where(eq(users.id, 1));

// 更新
await db.update(users)
  .set({ name: 'Johnny' })
  .where(eq(users.id, 1));

// 删除
await db.delete(users).where(eq(users.id, 1));

过滤和连接

import { eq, and, or, like, gt } from 'drizzle-orm';

// 复杂 where
const results = await db.select()
  .from(users)
  .where(
    and(
      gt(users.age, 18),
      like(users.email, '%@example.com')
    )
  );

// Join
const postsWithAuthors = await db.select()
  .from(posts)
  .leftJoin(users, eq(posts.authorId, users.id));

// 选择特定字段
const userNames = await db.select({
  id: users.id,
  name: users.name,
}).from(users);

关系

import { relations } from 'drizzle-orm';

export const usersRelations = relations(users, ({ many }) => ({
  posts: many(posts),
}));

export const postsRelations = relations(posts, ({ one }) => ({
  author: one(users, {
    fields: [posts.authorId],
    references: [users.id],
  }),
}));

// 带关系查询
const usersWithPosts = await db.query.users.findMany({
  with: {
    posts: true,
  },
});

配置(drizzle.config.ts)

import { defineConfig } from 'drizzle-kit';

export default defineConfig({
  schema: './src/db/schema.ts',
  out: './drizzle',
  dialect: 'postgresql',
  dbCredentials: {
    url: process.env.DATABASE_URL!,
  },
});

Next Steps