TypeScript ORM:对比与示例
在当今的 TypeScript Web 开发中,选择合适的 ORM(对象关系映射)可以显著加快开发速度并提高应用程序的可靠性。ORM 允许通过面向对象的方式操作数据库,避免编写原始 SQL 查询。在本文中,我们将比较三种最流行的 TypeScript ORM:Prisma、TypeORM 和 Drizzle,并展示它们的使用示例。
1. Prisma——现代标准
Prisma 是新一代 ORM,专注于开发人员体验和性能。它使用自己的模式描述语言(Prisma Schema)并生成完全类型化的客户端。
主要特性:
- 自动生成 TypeScript 类型
- 直观的查询 API
- 内置数据迁移(Prisma Migrate)
- 支持 PostgreSQL、MySQL、SQLite、MongoDB 等
TypeScript 代码示例:
// schema.prismamodel User { id Int @id @default(autoincrement()) name String email String @unique posts Post[]}
model Post { id Int @id @default(autoincrement()) title String content String? authorId Int author User @relation(fields: [authorId], references: [id])}
// 在代码中使用import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function getUsersWithPosts() { const users = await prisma.user.findMany({ include: { posts: true } }); return users;}2. TypeORM——TypeScript 的经典选择
TypeORM 是一个成熟的 ORM,同时支持 Active Record 和 Data Mapper 模式。它与 TypeScript 紧密集成,并使用装饰器来定义模型。
主要特性:
- 支持装饰器和类
- 两种方法:Active Record 和 Data Mapper
- 高级迁移和事件订阅
- 支持多种数据库
TypeScript 代码示例:
import { Entity, PrimaryGeneratedColumn, Column, OneToMany, createConnection } from "typeorm";
@Entity()export class User { @PrimaryGeneratedColumn() id: number;
@Column() name: string;
@Column({ unique: true }) email: string;
@OneToMany(() => Post, post => post.user) posts: Post[];}
@Entity()export class Post { @PrimaryGeneratedColumn() id: number;
@Column() title: string;
@Column({ nullable: true }) content: string;
@ManyToOne(() => User, user => user.posts) user: User;}
// 使用async function getUsersWithPosts() { const connection = await createConnection(); const userRepository = connection.getRepository(User); return await userRepository.find({ relations: ["posts"] });}3. Drizzle——轻量且高性能
Drizzle 是一个相对较新的 ORM,注重性能和最小的打包体积。它使用类似 SQL 的语法,无需代码生成。
主要特性:
- 体积小,速度快
- 原生支持 TypeScript,无需装饰器
- 类似 SQL 的 API(查询构建器)
- 兼容 SQL 数据库
TypeScript 代码示例:
import { drizzle } from 'drizzle-orm/better-sqlite3';import { sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';import Database from 'better-sqlite3';
const sqlite = new Database('test.db');const db = drizzle(sqlite);
// 定义模式const users = sqliteTable('users', { id: integer('id').primaryKey(), name: text('na