NEST.JS框架中TypeORM的安装和使用教程

 更新时间:2025年11月22日 15:06:35   作者:江城开朗的豌豆  
本文介绍了Nest.js框架及TypeORM的使用,包括环境准备、安装步骤、TypeORM的基本查询方法、查询构建器以及在实际业务中的应用

前言

Nest是构建高效可扩展的 Node.js Web 应用程序的框架。 默认使用JavaScript的超集TypeScript进行开发。

环境准备

查看node和npm版本:

$ node --version
v10.11.0
$ npm --version
6.5.0

安装@nestjs/cli

使用npm全局安装@nestjs/cli:

$ npm i -g @nestjs/cli
/usr/local/bin/nest -> /usr/local/lib/node_modules/@nestjs/cli/bin/nest.js
+ @nestjs/cli@5.7.1
added 11 packages from 6 contributors, 
removed 27 packages and updated 12 packages in 10.322s

使用nest --version命令查看nest当前版本:

$ nest --version
5.7.1

TypeORM安装

TypeORM无疑是 node.js 世界中最成熟的对象关系映射器(ORM )。由于它是用 TypeScript 编写的,所以它在 Nest 框架下运行得非常好

npm install typeorm reflect-metadata @types/node
# 安装数据库驱动
npm install mysql2  # MySQL
npm install pg     # PostgreSQL

TypeORM 中常用的数据库查询方法

1.count()- 计数方法

基本用法

// 统计所有记录
const total = await repository.count();

// 带条件的统计
const completedCount = await repository.count({
  where: { completed: true }
});

// 多个条件
const count = await repository.count({
  where: { 
    status: 'pending',
    userId: 1
  }
});

2.find()- 查询多条记录

基本查询

// 查询所有记录
const allRecords = await repository.find();

// 带条件查询
const pendingRecords = await repository.find({
  where: { status: 'pending' }
});

// 多个条件(AND)
const records = await repository.find({
  where: { 
    status: 'pending',
    userId: 1
  }
});

// 或条件(OR)
const records = await repository.find({
  where: [
    { status: 'pending' },
    { status: 'in-progress' }
  ]
});

复杂查询选项

const records = await repository.find({
  select: ['id', 'title', 'createdAt'],  // 选择特定字段
  where: { status: 'pending' },
  order: { createdAt: 'DESC' },          // 排序
  skip: 10,                              // 跳过前10条
  take: 20,                              // 取20条
  relations: ['images', 'user']          // 关联查询
});

3.findOne()- 查询单条记录

// 按ID查询
const record = await repository.findOne(1);

// 按条件查询
const record = await repository.findOne({
  where: { title: '特定标题' }
});

// 带关联查询
const record = await repository.findOne({
  where: { id: 1 },
  relations: ['images', 'user'],
  select: ['id', 'title', 'description']
});

4.findAndCount()- 查询并计数

// 分页查询,同时返回数据和总数
const [records, totalCount] = await repository.findAndCount({
  where: { status: 'pending' },
  skip: 0,
  take: 10,
  order: { createdAt: 'DESC' }
});

// 返回结果:{ records: [...], total: 100 }

5.create()和save()- 创建和保存

// 方法1:create + save
const newRecord = repository.create({
  title: '新标题',
  description: '描述内容',
  userId: 1
});
await repository.save(newRecord);

// 方法2:直接 save
await repository.save({
  title: '新标题',
  description: '描述内容',
  userId: 1
});

// 批量保存
await repository.save([
  { title: '标题1', userId: 1 },
  { title: '标题2', userId: 1 }
]);

6.update()- 更新记录

// 按条件更新
await repository.update(
  { status: 'pending' },      // 条件
  { status: 'completed' }     // 更新内容
);

// 按ID更新
await repository.update(1, { 
  title: '新标题',
  completed: true 
});

// 批量更新
await repository.update(
  { userId: 1 },
  { priority: 2 }
);

7.delete()- 删除记录

// 按ID删除
await repository.delete(1);

// 按条件删除
await repository.delete({ 
  status: 'completed' 
});

// 批量删除
await repository.delete([1, 2, 3]);

8. 查询构建器 (Query Builder)

// 复杂查询
const records = await repository
  .createQueryBuilder('report')
  .leftJoinAndSelect('report.images', 'image')
  .leftJoinAndSelect('report.user', 'user')
  .where('report.status = :status', { status: 'pending' })
  .andWhere('report.userId = :userId', { userId: 1 })
  .orderBy('report.createdAt', 'DESC')
  .skip(0)
  .take(10)
  .getMany();

// 原生SQL查询
const records = await repository
  .createQueryBuilder('report')
  .where('DATE(created_at) = :date', { date: '2024-01-01' })
  .getMany();

9. 在你的业务中的实际应用

// 上报记录的业务查询示例
export class ProblemReportService {
  // 获取用户的上报记录
  async getUserReports(userId: number, page: number = 1, limit: number = 10) {
    const [reports, total] = await this.problemReportRepository.findAndCount({
      where: { userId },
      relations: ['images', 'project'],
      order: { createdAt: 'DESC' },
      skip: (page - 1) * limit,
      take: limit
    });
    
    return {
      reports,
      total,
      page,
      totalPages: Math.ceil(total / limit)
    };
  }

  // 获取项目统计
  async getProjectStats(projectId: number) {
    const total = await this.problemReportRepository.count({
      where: { projectId }
    });
    
    const byStatus = await this.problemReportRepository
      .createQueryBuilder('report')
      .select('report.status, COUNT(*) as count')
      .where('report.projectId = :projectId', { projectId })
      .groupBy('report.status')
      .getRawMany();
    
    return { total, byStatus };
  }

  // 更新上报状态
  async updateReportStatus(id: number, status: number) {
    await this.problemReportRepository.update(id, { status });
    return this.problemReportRepository.findOne(id);
  }
}

10. 常用查询条件运算符

// 比较运算符
const records = await repository.find({
  where: {
    priority: MoreThan(2),           // 大于
    createdAt: LessThan(new Date()), // 小于
    userId: In([1, 2, 3]),           // 在数组中
    title: Like('%关键词%')           // 模糊查询
  }
});

// 范围查询
const records = await repository.find({
  where: {
    createdAt: Between(
      new Date('2024-01-01'),
      new Date('2024-01-31')
    )
  }
});

总结

到此这篇关于NEST.JS框架中TypeORM的安装和使用教程的文章就介绍到这了,更多相关TypeORM使用指南内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 纯js实现瀑布流展现照片(自动适应窗口大小)

    纯js实现瀑布流展现照片(自动适应窗口大小)

    用瀑布流来展现照片再好不过了,我的思路大概是一张一张的图片插入,当这一行的图片保持长宽比例不变并且高度低于250时就完成一个了循环,即这一行插入进去了
    2013-04-04
  • js实现页面导航层级指示效果

    js实现页面导航层级指示效果

    这篇文章主要为大家详细介绍了js实现页面导航层级指示效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • js跟随滚动条滚动浮动代码

    js跟随滚动条滚动浮动代码

    js跟随滚动条滚动浮动代码,对于firefox不兼容。
    2009-12-12
  • JavaScript实现图片拖曳效果

    JavaScript实现图片拖曳效果

    这篇文章主要为大家详细介绍了JavaScript实现图片拖曳效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • ES6之Proxy的get方法详解

    ES6之Proxy的get方法详解

    这篇文章主要介绍了ES6之Proxy的get方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 微信小程序如何连接Java后台

    微信小程序如何连接Java后台

    这篇文章主要介绍了微信小程序如何连接Java后台,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • jQuery右下角旋转环状菜单特效代码

    jQuery右下角旋转环状菜单特效代码

    jquery实现右下角旋转环形菜单特效代码,是固定在页面右下角位置,当用户点击了主菜单按钮后,子菜单项会以环状旋转进入页面,并使用animate.css制作动画效果,有需要的朋友可以参考下
    2015-08-08
  • 微信小程序报错:does not have a method "xxxx" to handle event "tap"的解决方案

    微信小程序报错:does not have a method "xxxx" to ha

    这篇文章主要给大家介绍了关于微信小程序报错:does not have a method "xxxx" to handle event "tap"的解决方案,文中将解决的办法介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • 微信小程序使用canvas绘制钟表

    微信小程序使用canvas绘制钟表

    这篇文章主要为大家详细介绍了微信小程序使用canvas绘制钟表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Javascript异步执行不按顺序解决方案

    Javascript异步执行不按顺序解决方案

    这篇文章主要介绍了Javascript异步执行不按顺序解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04

最新评论