Drizzle ORM首頁、文檔和下載- 用於SQL 數據庫的TypeScript ORM – Development details

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *