NEST.JS框架中TypeORM的安裝和使用教程
前言
Nest是構(gòu)建高效可擴(kuò)展的 Node.js Web 應(yīng)用程序的框架。 默認(rèn)使用JavaScript的超集TypeScript進(jìn)行開(kāi)發(fā)。
環(huán)境準(zhǔn)備
查看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當(dāng)前版本:
$ nest --version 5.7.1
TypeORM安裝
TypeORM無(wú)疑是 node.js 世界中最成熟的對(duì)象關(guān)系映射器(ORM )。由于它是用 TypeScript 編寫的,所以它在 Nest 框架下運(yùn)行得非常好
npm install typeorm reflect-metadata @types/node # 安裝數(shù)據(jù)庫(kù)驅(qū)動(dòng) npm install mysql2 # MySQL npm install pg # PostgreSQL
TypeORM 中常用的數(shù)據(jù)庫(kù)查詢方法
1.count()- 計(jì)數(shù)方法
基本用法
// 統(tǒng)計(jì)所有記錄
const total = await repository.count();
// 帶條件的統(tǒng)計(jì)
const completedCount = await repository.count({
where: { completed: true }
});
// 多個(gè)條件
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' }
});
// 多個(gè)條件(AND)
const records = await repository.find({
where: {
status: 'pending',
userId: 1
}
});
// 或條件(OR)
const records = await repository.find({
where: [
{ status: 'pending' },
{ status: 'in-progress' }
]
});復(fù)雜查詢選項(xiàng)
const records = await repository.find({
select: ['id', 'title', 'createdAt'], // 選擇特定字段
where: { status: 'pending' },
order: { createdAt: 'DESC' }, // 排序
skip: 10, // 跳過(guò)前10條
take: 20, // 取20條
relations: ['images', 'user'] // 關(guān)聯(lián)查詢
});3.findOne()- 查詢單條記錄
// 按ID查詢
const record = await repository.findOne(1);
// 按條件查詢
const record = await repository.findOne({
where: { title: '特定標(biāo)題' }
});
// 帶關(guān)聯(lián)查詢
const record = await repository.findOne({
where: { id: 1 },
relations: ['images', 'user'],
select: ['id', 'title', 'description']
});4.findAndCount()- 查詢并計(jì)數(shù)
// 分頁(yè)查詢,同時(shí)返回?cái)?shù)據(jù)和總數(shù)
const [records, totalCount] = await repository.findAndCount({
where: { status: 'pending' },
skip: 0,
take: 10,
order: { createdAt: 'DESC' }
});
// 返回結(jié)果:{ records: [...], total: 100 }5.create()和save()- 創(chuàng)建和保存
// 方法1:create + save
const newRecord = repository.create({
title: '新標(biāo)題',
description: '描述內(nèi)容',
userId: 1
});
await repository.save(newRecord);
// 方法2:直接 save
await repository.save({
title: '新標(biāo)題',
description: '描述內(nèi)容',
userId: 1
});
// 批量保存
await repository.save([
{ title: '標(biāo)題1', userId: 1 },
{ title: '標(biāo)題2', userId: 1 }
]);6.update()- 更新記錄
// 按條件更新
await repository.update(
{ status: 'pending' }, // 條件
{ status: 'completed' } // 更新內(nèi)容
);
// 按ID更新
await repository.update(1, {
title: '新標(biāo)題',
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. 查詢構(gòu)建器 (Query Builder)
// 復(fù)雜查詢
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. 在你的業(yè)務(wù)中的實(shí)際應(yīng)用
// 上報(bào)記錄的業(yè)務(wù)查詢示例
export class ProblemReportService {
// 獲取用戶的上報(bào)記錄
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)
};
}
// 獲取項(xiàng)目統(tǒng)計(jì)
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 };
}
// 更新上報(bào)狀態(tài)
async updateReportStatus(id: number, status: number) {
await this.problemReportRepository.update(id, { status });
return this.problemReportRepository.findOne(id);
}
}10. 常用查詢條件運(yùn)算符
// 比較運(yùn)算符
const records = await repository.find({
where: {
priority: MoreThan(2), // 大于
createdAt: LessThan(new Date()), // 小于
userId: In([1, 2, 3]), // 在數(shù)組中
title: Like('%關(guān)鍵詞%') // 模糊查詢
}
});
// 范圍查詢
const records = await repository.find({
where: {
createdAt: Between(
new Date('2024-01-01'),
new Date('2024-01-31')
)
}
});總結(jié)
到此這篇關(guān)于NEST.JS框架中TypeORM的安裝和使用教程的文章就介紹到這了,更多相關(guān)TypeORM使用指南內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript實(shí)現(xiàn)類似超鏈接的效果
這篇文章主要介紹了使用javascript實(shí)現(xiàn)類似超鏈接的效果的特效,通過(guò)示例熟悉javascript事件,這里推薦給大家。2014-12-12
openlayers實(shí)現(xiàn)地圖測(cè)距測(cè)面
這篇文章主要為大家詳細(xì)介紹了openlayers實(shí)現(xiàn)地圖測(cè)距測(cè)面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09
js實(shí)現(xiàn)0ms延時(shí)定時(shí)器的幾種方式
本文主要介紹了js實(shí)現(xiàn)0ms延時(shí)定時(shí)器的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
mysql輸出數(shù)據(jù)賦給js變量報(bào)unterminated string literal錯(cuò)誤原因
mysql 數(shù)據(jù)庫(kù)數(shù)據(jù)賦給js變量報(bào)unterminated string literal錯(cuò)誤原因2010-05-05
JS定時(shí)器用法分析【時(shí)鐘與菜單中的應(yīng)用】
這篇文章主要介紹了JS定時(shí)器用法,結(jié)合時(shí)鐘與菜單中的應(yīng)用分析了JS中setInterval與setTimeout操作時(shí)間的相關(guān)技巧,需要的朋友可以參考下2016-12-12
JavaScript中的undefined學(xué)習(xí)總結(jié)
這篇文章主要是對(duì)JavaScript中的undefined進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-11-11
JavaScript將數(shù)組轉(zhuǎn)換成CSV格式的方法
這篇文章主要介紹了JavaScript將數(shù)組轉(zhuǎn)換成CSV格式的方法,實(shí)例分析了javascript使用valueOf方法將數(shù)組值轉(zhuǎn)換為csv格式字符串的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-03-03

