TypeScript ORM:对比与示例
在现代 TypeScript 网页开发中,选择合适的 ORM(对象关系映射)是一个关键决策,它会影响项目的架构、性能和可维护性。ORM 允许你通过编程语言的对象来操作数据库,从而抽象 SQL 查询。本文将介绍三种最流行的 TypeScript ORM:TypeORM、Prisma 和 MikroORM。你将了解它们的优缺点,并看到每种 ORM 的代码示例。
1. TypeORM
TypeORM 是 TypeScript 和 JavaScript 中最古老、最成熟的 ORM 之一。它支持 Active Record 和 Data Mapper 模式,以及多种数据库:PostgreSQL、MySQL、SQLite、MongoDB 等。
TypeORM 特点:
- 支持使用装饰器定义实体
- 灵活的关系:OneToOne、OneToMany、ManyToMany
- 迁移和模式同步
- 支持订阅和生命周期事件
- 用于复杂查询的 Query Builder
TypeORM 代码示例:
import { Entity, PrimaryGeneratedColumn, Column, BaseEntity, createConnection } from "typeorm";
@Entity()export class User extends BaseEntity { @PrimaryGeneratedColumn() id: number;
@Column() name: string;
@Column() email: string;}
async function main() { await createConnection({ type: "postgres", host: "localhost", port: 5432, username: "test", password: "test", database: "test", entities: [User], synchronize: true, });
const user = new User(); user.name = "伊万"; user.email = "ivan@example.com"; await user.save();
const users = await User.find(); console.log(users);}优点:社区庞大,教程众多,支持 MongoDB。缺点:配置复杂,lazy loading 存在问题,API 有时不够直观。
2. Prisma
Prisma 是一种现代 ORM,它重新定义了与数据库交互的方式。它不采用传统 ORM,而是提供三个组件:Prisma Client(自动生成的类型安全客户端)、Prisma Migrate(迁移系统)和 Prisma Studio(图形界面)。
Prisma 特点:
- 声明式数据模式(schema.prisma)
- 基于模式的完全类型化——无需手动定义类型
- 自动生成客户端
- 支持事务和分页
- 与 GraphQL 集成(Nexus、TypeGraphQL)
Prisma 代码示例:
// 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])}
// main.tsimport { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() { const user = await prisma.user.create({ data: { name: '玛丽亚', email: 'maria@example.com', posts: { create: { title: '我的第一篇文章' } } }, include: { posts: true } });
const users = await prisma.user.findMany({ include: { posts: true } }); console.log(users);}
main() .catch(e => console.error(e)) .finally(() => prisma.$disconnect());优点:同类最佳的类型化,语法简单,文档优秀。缺点:依赖模式,自定义查询复杂,内存消耗较大。
3. MikroORM
MikroORM 是一种微型 ORM,灵感来源于 Doctrine