TypeScript ORM:对比与使用示例
在现代 TypeScript 开发中,选择合适的 ORM(对象关系映射)是一个基础性决策,它会影响性能、代码可读性和开发速度。本文将详细对比三种最流行的 TypeScript ORM:Prisma、TypeORM 和 MikroORM。您将了解它们的优缺点、看到代码示例,并获得针对您项目的实用建议。
1. Prisma —— 现代标准
Prisma 是新一代 ORM,它使用自己的声明式模式语言。它会根据您的数据库模式自动生成类型安全的客户端。Prisma 支持 PostgreSQL、MySQL、SQLite、SQL Server 和 MongoDB。
优点:
- 强大的类型系统 —— 所有查询在编译时都会进行类型检查
- 内置迁移工具和可视化编辑器 Prisma Studio
- 出色的文档和活跃的社区
- IDE 中的自动补全功能
缺点:
- 需要额外的客户端生成步骤
- 对于复杂 SQL 查询的灵活性较低
- 包体积相对较大
代码示例:
// schema.prismamodel User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[]}
model Post { id Int @id @default(autoincrement()) title String content String? authorId Int author User @relation(fields: [authorId], references: [id])}// app.tsimport { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() { // 创建用户及其帖子 const user = await prisma.user.create({ data: { email: 'alice@example.com', name: 'Alice', posts: { create: { title: 'Hello World' } } }, include: { posts: true } });
// 带过滤条件的查询 const users = await prisma.user.findMany({ where: { email: { contains: 'alice' } }, orderBy: { name: 'asc' } });
console.log(users);}
main();2. TypeORM —— 久经考验的老将
TypeORM 是最古老的 TypeScript ORM 之一,受 Hibernate 和 Entity Framework 启发。它使用装饰器定义实体,并支持 Active Record 和 Data Mapper 模式。它适用于大多数关系型数据库。
优点:
- 灵活的装饰器系统
- 支持迁移和模式同步
- 大量的集成和扩展
- 成熟且经过时间验证的项目
缺点:
- 与 Prisma 相比,类型检查不够严格
- 对新手来说配置复杂
- 近期发展速度较慢
代码示例:
// entity/User.tsimport { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';import { Post } from './Post';
@Entity()export class User { @PrimaryGeneratedColumn() id: number;
@Column({ unique: true }) email: string;
@Column({ nullable: true }) name: string;
@OneToMany(() => Post, (post) => post.author) posts: Post[];}// app.tsimport { createConnection } from 'typeorm';import { User } from './entity/User';
async function main() { const connection = await createConnection(); const userRepo = connection.getRepository(User);
// 创建 const user = userRepo.create({ email: 'bob@example.com', name: 'Bob' }); await userRepo.save(user);
// 查询 const users = await userRepo.find({ where: { name: Like('%Bob%') }, relations: ['posts'] });
console.log(users);}
main();