适用于 JavaScript (Node.js) 的 ORM:对比与示例
在 Node.js 上开发服务端应用时,与数据库的交互是一项关键任务。对象关系映射(ORM)允许通过 JavaScript 对象操作关系型数据库,免去编写纯 SQL 的麻烦。本文我们将分析三种流行的 ORM:Sequelize、TypeORM 和 Prisma,比较它们的特点,并提供实用示例。
1. Sequelize
Sequelize 是 Node.js 最古老且最成熟的 ORM 之一。支持 PostgreSQL、MySQL、MariaDB、SQLite 和 MSSQL。基于 Promise 和 async/await 运行。
安装与配置
npm install sequelize sequelize-clinpm install pg pg-hstore # 用于 PostgreSQL模型与查询示例
const { Sequelize, DataTypes } = require('sequelize');const sequelize = new Sequelize('postgres://user:pass@localhost:5432/mydb');
// 定义模型const User = sequelize.define('User', { name: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, unique: true }});
// 创建记录const user = await User.create({ name: '伊万', email: 'ivan@example.com' });
// 带筛选的查询const users = await User.findAll({ where: { name: '伊万' } });
// 更新await User.update({ email: 'new@example.com' }, { where: { id: 1 } });优点与缺点
- + 社区庞大,文档丰富
- + 支持迁移和数据填充
- - 复杂查询语法冗长
- - 无内置 TypeScript 支持
2. TypeORM
TypeORM 是一款面向 TypeScript 的 ORM,但也适用于普通 JavaScript。支持装饰器、Active Record 和 Data Mapper 模式。兼容大多数主流数据库系统。
安装与配置
npm install typeorm reflect-metadatanpm install pg # 用于 PostgreSQL使用装饰器的模型示例
import { Entity, PrimaryGeneratedColumn, Column, createConnection } from 'typeorm';
@Entity()export class User { @PrimaryGeneratedColumn() id: number;
@Column() name: string;
@Column({ unique: true }) email: string;}
// 使用const connection = await createConnection();const userRepo = connection.getRepository(User);const user = await userRepo.save({ name: '安娜', email: 'anna@example.com' });const users = await userRepo.find({ where: { name: '安娜' } });优点与缺点
- + 出色的 TypeScript 支持
- + 两种模式:Active Record 和 Data Mapper
- - 对新手配置复杂
- - 大型项目中迁移速度慢
3. Prisma
Prisma 是一款现代 ORM,使用自己的模式语言并生成类型安全的客户端。被认为性能最高且对开发者最友好。
安装与配置
npm install @prisma/clientnpx prisma init定义模式 (schema.prisma)
model User { id Int @id @default(autoincrement()) name String email String @unique}查询示例
import { PrismaClient } from '@prisma/client';const prisma = new PrismaClient();
// 创建const user = await prisma.user.create({ data: { name: '奥尔加', email: 'olga@example.com' }});
// 查询const users = await prisma.user.findMany({ where: { name: '奥尔加' } });
// 更新await prisma.user.update({ where: { id: 1 }, data: { email: 'new@example.com' }});优点与缺点
- + 完全类型安全