Drizzle ORM 是用於SQL 數據庫的TypeScript ORM,在設計時考慮到了最大的類型安全性。它帶有用於自動生成SQL 遷移的drizzle-kit CLI 。
Drizzle ORM 是一個庫,而不是一個框架,它的主要哲學是“如果你知道SQL,你就知道Drizzle ORM”,因此設計的時候盡可能遵循類似SQL 的語法,強類型化並在編譯時就會失敗,而不是在運行時。
功能列表
- 全類型安全
- 智能自動遷移生成
- 沒有ORM 學習曲線
- 用於表定義和查詢的類似於SQL 的語法
- 一流的全類型連接
- 任何復雜性的全類型部分和非部分選擇
- 自動推斷DB 模型的TS 類型以分別選擇和插入
- Zod 架構生成
- 零依賴
支持的數據庫
安裝
npm install drizzle-orm
npm install -D drizzle-kit
功能展示(PostgreSQL)
注意:不要忘記安裝 pg
和 @types/pg
包。
import { drizzle } from 'drizzle-orm/node-postgres';
import { integer, pgTable, serial, text, timestamp, varchar } from 'drizzle-orm/pg-core';
import { InferModel, eq, sql } from 'drizzle-orm';
import { Pool } from 'pg';
export const users = pgTable('users', {
id: serial('id').primaryKey(),
fullName: text('full_name').notNull(),
phone: varchar('phone', { length: 20 }).notNull(),
role: text('role', { enum: ['user', 'admin'] }).default('user').notNull(),
cityId: integer('city_id').references(() => cities.id),
createdAt: timestamp('created_at').defaultNow().notNull(),
updatedAt: timestamp('updated_at').defaultNow().notNull(),
});
export type User = InferModel<typeof users>;
export type NewUser = InferModel<typeof users, 'insert'>;
export const cities = pgTable('cities', {
id: serial('id').primaryKey(),
name: text('name').notNull(),
});
export type City = InferModel<typeof cities>;
export type NewCity = InferModel<typeof cities, 'insert'>;
const pool = new Pool({
connectionString: 'postgres://user:password@host:port/db',
});
const db = drizzle(pool);
// Insert
const newUser: NewUser = {
fullName: 'John Doe',
phone: '+123456789',
};
const insertedUsers /* : User[] */ = await db.insert(users).values(newUser).returning();
const insertedUser = insertedUsers[0]!;
const newCity: NewCity = {
name: 'New York',
};
const insertedCities /* : City[] */ = await db.insert(cities).values(newCity).returning();
const insertedCity = insertedCities[0]!;
// Update
const updateResult /* : { updated: Date }[] */ = await db.update(users)
.set({ cityId: insertedCity.id, updatedAt: new Date() })
.where(eq(users.id, insertedUser.id))
.returning({ updated: users.updatedAt });
// Select
const allUsers /* : User[] */ = await db.select().from(users);
// Select custom fields
const upperCaseNames /* : { id: number; name: string }[] */ = await db
.select({
id: users.id,
name: sql<string>`upper(${users.fullName})`,
})
.from(users);
// Joins
// You wouldn't BELIEVE how SMART the result type is! 😱
const allUsersWithCities = await db
.select({
id: users.id,
name: users.fullName,
city: {
id: cities.id,
name: cities.name,
},
})
.from(users)
.leftJoin(cities, eq(users.cityId, cities.id));
// Delete
const deletedNames /* : { name: string }[] */ = await db.delete(users)
.where(eq(users.id, insertedUser.id))
.returning({ name: users.fullName });
#Drizzle #ORM首頁文檔和下載 #用於SQL #數據庫的TypeScript #ORM #Development details