JavaScript (Node.js) 的 ORM:对比与示例
在 Node.js 后端开发中,迟早会遇到与数据库交互的问题。编写纯 SQL 查询既耗时又容易出错。这时,ORM(对象关系映射)库就派上了用场,它允许您像操作普通 JavaScript 对象一样操作数据库表。本文将对比三种最流行的 Node.js ORM:Sequelize、TypeORM 和 Prisma,并提供清晰的代码示例。
1. Sequelize
Sequelize 是 Node.js 中最古老、最成熟的 ORM 之一。它支持 PostgreSQL、MySQL、MariaDB、SQLite 和 Microsoft SQL Server。Sequelize 采用经典的模型和 Promise(或 async/await)方法。
安装
npm install sequelize pg pg-hstore示例:定义模型和查询
const { Sequelize, DataTypes } = require('sequelize');const sequelize = new Sequelize('database', 'user', 'password', { host: 'localhost', dialect: 'postgres'});
const User = sequelize.define('User', { name: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, unique: true }});
async function createUser() { await sequelize.sync(); const user = await User.create({ name: '伊万', email: 'ivan@example.com' }); console.log(user.toJSON());}createUser();Sequelize 特性
- 成熟稳定,社区庞大。
- 支持事务、迁移和数据填充。
- 灵活的关联系统(hasOne、hasMany、belongsToMany)。
- 缺点:部分语法冗长,调试较复杂。
2. TypeORM
TypeORM 是一个既支持 JavaScript 也支持 TypeScript 的 ORM。它支持与 Sequelize 相同的数据库,并提供两种方法:Active Record 和 Data Mapper。TypeORM 还大量使用装饰器,使代码更具声明性。
安装
npm install typeorm reflect-metadata pg示例:使用装饰器的模型和查询
import { Entity, PrimaryGeneratedColumn, Column, createConnection } from 'typeorm';
@Entity()class User { @PrimaryGeneratedColumn() id: number;
@Column() name: string;
@Column({ unique: true }) email: string;}
async function createUser() { const connection = await createConnection({ type: 'postgres', host: 'localhost', database: 'test', entities: [User], synchronize: true }); const user = new User(); user.name = '玛丽亚'; user.email = 'maria@example.com'; await connection.manager.save(user); console.log(user);}createUser();TypeORM 特性
- 与 TypeScript 和装饰器完美集成。
- 灵活性:可在 Active Record 和 Data Mapper 之间选择。
- 支持迁移、事件订阅和日志记录。
- 缺点:文档有时不完整,常有破坏性变更。
3. Prisma
Prisma 是一个现代 ORM,与前辈们有根本不同。您不是在代码中定义模型,而是在一个专门的 schema.prisma 文件中描述数据模式,然后 Prisma 会生成类型安全的客户端。这提供了 IDE 中的自动补全功能,并最大限度地减少了错误。
安装
npm install @prisma/clientnpx prisma init示例:模式定义和查询
schema.prisma:
datasource db { provider = "postgresql" url = env("DATABASE_URL")}
model User { id Int @id @default(autoincrement()) name String email String @unique}JavaScript 代码:
const { PrismaClie