适用于 JavaScript (Node.js) 的 ORM:Sequelize、TypeORM、Prisma 对比

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

适用于 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' }});


优点与缺点

  • + 完全类型安全

推荐