当前位置: 首页 > article >正文

小满nestjs(第二十五章 NestJS ORM实战:TypeORM连接MySQL与实体映射)

1. TypeORM连接MySQL的完整配置指南第一次在NestJS项目中使用TypeORM连接MySQL时我踩了不少坑。记得当时因为一个简单的端口配置错误折腾了大半天才成功连接。现在回想起来其实只要掌握几个关键配置项整个过程可以非常顺畅。首先确保你已经安装了必要的依赖包。打开终端在项目目录下执行npm install --save nestjs/typeorm typeorm mysql2这三个包各司其职nestjs/typeorm是NestJS的集成模块typeorm是ORM核心库mysql2则是MySQL的Node.js驱动。安装完成后我们需要在app.module.ts中进行配置。下面是一个完整的配置示例import { Module } from nestjs/common; import { TypeOrmModule } from nestjs/typeorm; Module({ imports: [ TypeOrmModule.forRoot({ type: mysql, host: localhost, port: 3306, username: root, password: yourpassword, database: test_db, entities: [__dirname /**/*.entity{.ts,.js}], synchronize: true, logging: true, retryDelay: 3000, retryAttempts: 5, autoLoadEntities: true, }), ], }) export class AppModule {}这里有几个关键参数需要特别注意synchronize开发环境可以设为true它会自动同步实体到数据库结构。但生产环境一定要设为false否则可能导致数据丢失autoLoadEntities这个配置让TypeORM能自动发现通过forFeature()注册的实体retryAttempts和retryDelay在网络不稳定的环境下这些重试配置能提高连接成功率2. 实体定义与装饰器详解实体(Entity)是TypeORM的核心概念它把数据库表映射为TypeScript类。我第一次定义实体时被各种装饰器搞得有点懵后来发现其实它们都有明确的对应关系。让我们创建一个用户实体作为示例import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from typeorm; Entity() export class User { PrimaryGeneratedColumn() id: number; Column({ length: 50, unique: true }) username: string; Column({ select: false }) password: string; Column({ default: true }) isActive: boolean; CreateDateColumn() createdAt: Date; UpdateDateColumn() updatedAt: Date; }每个装饰器都有特定的用途Entity()标记这个类是一个实体对应数据库中的一张表PrimaryGeneratedColumn()自增主键Column()普通列可以传入配置对象定义更多属性CreateDateColumn()和UpdateDateColumn()特殊列类型会自动维护创建和更新时间在实际项目中我建议为每个实体都添加createdAt和updatedAt字段这对后期排查问题非常有帮助。另外密码字段一定要设置select: false避免查询时意外泄露敏感信息。3. Repository模式的实战应用TypeORM提供了几种操作数据的方式其中Repository模式是我最常用的。它封装了大量常用方法让数据库操作变得异常简单。首先需要在模块中注册实体import { Module } from nestjs/common; import { TypeOrmModule } from nestjs/typeorm; import { User } from ./user.entity; Module({ imports: [TypeOrmModule.forFeature([User])], providers: [UserService], }) export class UserModule {}然后在服务中注入Repositoryimport { Injectable } from nestjs/common; import { InjectRepository } from nestjs/typeorm; import { Repository } from typeorm; import { User } from ./user.entity; Injectable() export class UserService { constructor( InjectRepository(User) private userRepository: RepositoryUser, ) {} async findAll(): PromiseUser[] { return this.userRepository.find(); } async findOne(id: number): PromiseUser { return this.userRepository.findOne({ where: { id } }); } async create(user: PartialUser): PromiseUser { const newUser this.userRepository.create(user); return this.userRepository.save(newUser); } async update(id: number, user: PartialUser): PromiseUser { await this.userRepository.update(id, user); return this.userRepository.findOne({ where: { id } }); } async remove(id: number): Promisevoid { await this.userRepository.delete(id); } }Repository提供了丰富的APIfind()查询所有记录findOne()查询单条记录create()和save()创建新记录update()更新记录delete()删除记录在实际开发中我经常需要添加一些自定义查询。这时可以使用queryBuilderasync findActiveUsers(): PromiseUser[] { return this.userRepository .createQueryBuilder(user) .where(user.isActive :isActive, { isActive: true }) .orderBy(user.createdAt, DESC) .getMany(); }4. 开发与生产环境的最佳实践经过多个项目的实践我总结出一些TypeORM在不同环境下的使用经验。开发环境配置建议开启synchronize自动同步实体变更到数据库开启logging查看生成的SQL语句使用内存数据库如SQLite进行单元测试TypeOrmModule.forRoot({ // 开发环境配置 synchronize: true, logging: true, // 其他配置... })生产环境注意事项必须关闭synchronize避免意外修改表结构关闭logging减少I/O开销配置连接池提高性能使用SSL连接保证数据安全TypeOrmModule.forRoot({ // 生产环境配置 synchronize: false, logging: false, extra: { connectionLimit: 10, // 连接池大小 ssl: { rejectUnauthorized: false, }, }, // 其他配置... })迁移管理 生产环境应该使用迁移来管理数据库变更。TypeORM提供了迁移工具# 生成迁移文件 npx typeorm migration:generate -n YourMigrationName # 运行迁移 npx typeorm migration:run我曾经在一个项目中因为没有使用迁移直接在生产环境开启了synchronize结果导致部分测试数据被意外删除。从那以后我始终坚持在开发环境使用synchronize在生产环境使用迁移。5. 常见问题与性能优化在使用TypeORM的过程中我遇到过不少性能问题和奇怪的行为。这里分享几个典型案例和解决方案。N1查询问题 这是ORM常见的性能陷阱。比如下面的代码const users await userRepository.find(); users.forEach(user { console.log(user.posts); // 每次访问都会触发查询 });解决方案是使用relations预加载关联数据const users await userRepository.find({ relations: [posts] });批量插入优化 直接使用save()插入大量数据会很慢// 不推荐 for (const item of largeArray) { await repository.save(item); }应该使用insert()方法// 推荐 await repository.insert(largeArray);索引与查询优化 为常用查询条件添加索引能显著提高性能Entity() export class Product { Index() Column() categoryId: number; }对于复杂查询可以使用原生SQLconst result await manager.query( SELECT p.*, c.name as categoryName FROM product p JOIN category c ON p.categoryId c.id WHERE p.price ? , [100]);缓存策略 TypeORM支持查询缓存const products await productRepository.find({ where: { categoryId: 1 }, cache: true, // 启用缓存 });在实际项目中我建议对不常变动的数据如配置项、分类信息启用缓存而对高频更新的数据如用户订单则禁用缓存。

相关文章:

小满nestjs(第二十五章 NestJS ORM实战:TypeORM连接MySQL与实体映射)

1. TypeORM连接MySQL的完整配置指南 第一次在NestJS项目中使用TypeORM连接MySQL时,我踩了不少坑。记得当时因为一个简单的端口配置错误,折腾了大半天才成功连接。现在回想起来,其实只要掌握几个关键配置项,整个过程可以非常顺畅。…...

别再手动查字典了!用EggNOG-mapper 5.0一键搞定GO/KEGG/COG注释(附完整流程)

基因功能注释自动化:EggNOG-mapper 5.0实战指南 在基因组学研究中,功能注释是连接序列数据与生物学意义的关键桥梁。传统的手动注释流程往往需要研究人员在多数据库间反复切换,不仅耗时费力,还容易引入人为误差。而EggNOG-mapper…...

照片元数据管理终极指南:3步告别繁琐手动操作

照片元数据管理终极指南:3步告别繁琐手动操作 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui 你是否曾因数百张照片的拍摄时间错误而头痛不已?是否在为大量图片添加版权信息时感到力…...

Linux 设备树深度解析之Amlogic SoC 多媒体

第一部分:Amlogic Canvas —— 视频像素缓冲区元数据中间件1.1 设计精髓分析Amlogic Canvas本质上是一个硬件级别的像素缓冲区描述符池。它存储每个编号对应的宽度、高度、物理地址、包裹模式、块模式(GXBB及之后还支持端序)等元数据。视频解…...

如何用Python操控Photoshop?3步实现自动化图像处理的终极指南

如何用Python操控Photoshop?3步实现自动化图像处理的终极指南 【免费下载链接】photoshop-python-api Python API for Photoshop. 项目地址: https://gitcode.com/gh_mirrors/ph/photoshop-python-api Photoshop Python API是一个革命性的工具,让…...

从图形变换到机器学习:行列式到底在‘衡量’什么?一个直观的几何理解指南

从图形变换到机器学习:行列式到底在‘衡量’什么?一个直观的几何理解指南 想象你手中有一张弹性薄膜,拉伸、旋转或挤压它时,薄膜覆盖的面积会如何变化?这种直观的几何变换背后,隐藏着线性代数中行列式的本质…...

基于LLM的邮件智能体:从语义理解到自动化工作流实战

1. 项目概述:一个能“思考”的邮件智能体 最近在折腾一个挺有意思的开源项目,叫 XueJourney/mail-agent 。简单来说,它不是一个简单的邮件收发工具,而是一个能帮你“思考”和“行动”的邮件智能体。想象一下,你每天被…...

OBS Source Record插件深度解析:5个实战技巧实现多源独立录制

OBS Source Record插件深度解析:5个实战技巧实现多源独立录制 【免费下载链接】obs-source-record 项目地址: https://gitcode.com/gh_mirrors/ob/obs-source-record 你是否曾经在直播或视频制作中,想要单独录制某个摄像头画面、游戏窗口或浏览器…...

FanControl深度解析:完全掌控Windows风扇转速的专业级工具

FanControl深度解析:完全掌控Windows风扇转速的专业级工具 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendin…...

5个高效方法:如何用AKShare处理金融数据去重,避免重复数据干扰分析

5个高效方法:如何用AKShare处理金融数据去重,避免重复数据干扰分析 【免费下载链接】akshare AKShare is an elegant and simple financial data interface library for Python, built for human beings! 开源财经数据接口库 项目地址: https://gitcod…...

2026年最值得投入的5款AI Agent工具:Gartner认证+生产环境压测数据全公开

更多请点击: https://intelliparadigm.com 第一章:2026年最佳AI Agent工具推荐 2026年,AI Agent 已从概念原型迈入企业级生产部署阶段。开发者不再满足于单任务自动化,而是追求具备长期记忆、跨平台协调与自主目标分解能力的智能…...

[技术解析] 边缘结构模型MSM:破解时依性混杂的因果推断利器

1. 边缘结构模型MSM:因果推断的"时光机" 想象你是一名医生,正在研究某种降压药的长期疗效。患者A连续服药3个月后血压稳定,患者B服药1个月后自行停药导致血压反弹。传统统计方法会简单对比两组结果,但忽略了一个关键问…...

如何用ImageSearch在千万级图库中秒速找到任何图片:新手终极指南

如何用ImageSearch在千万级图库中秒速找到任何图片:新手终极指南 【免费下载链接】ImageSearch 基于.NET10的本地硬盘千万级图库以图搜图案例Demo和图片exif信息移除小工具分享 项目地址: https://gitcode.com/gh_mirrors/im/ImageSearch 你是否曾因为找不到…...

从丝杆到直线电机:半导体运动台驱动技术演进与选型指南

1. 半导体运动台驱动技术的核心挑战 在半导体制造领域,运动平台就像精密仪器的心脏,每一次跳动都关乎生产效率和产品质量。想象一下,光刻机要在指甲盖大小的芯片上绘制比头发丝还细的电路,这相当于让一台卡车在足球场上精准停到误…...

5分钟完全指南:roop-unleashed AI换脸神器从入门到精通

5分钟完全指南:roop-unleashed AI换脸神器从入门到精通 【免费下载链接】roop-unleashed Evolved Fork of roop with Web Server and lots of additions 项目地址: https://gitcode.com/gh_mirrors/ro/roop-unleashed 想要在几分钟内制作专业级的AI换脸视频吗…...

从App Inventor到数据解析:打造一个专属的Android蓝牙温湿度监测App(适配HC-05+Arduino)

从零构建Android蓝牙温湿度监测系统:App Inventor与Arduino实战指南 在物联网技术快速普及的今天,将传感器数据可视化呈现已成为许多创客和教育场景中的常见需求。本文将以DHT-11温湿度传感器为核心,通过HC-05蓝牙模块搭建Arduino与Android设…...

DeepSeek-Coder-V2:企业级代码智能的革命性突破

DeepSeek-Coder-V2:企业级代码智能的革命性突破 【免费下载链接】DeepSeek-Coder-V2 DeepSeek-Coder-V2: Breaking the Barrier of Closed-Source Models in Code Intelligence 项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-Coder-V2 在数字化…...

3D设计工作流救星:STL转STEP一键转换,让CAD协作不再卡顿 [特殊字符]

3D设计工作流救星:STL转STEP一键转换,让CAD协作不再卡顿 😊 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp 您是否遇到过这样的困境?精心设计的3…...

NotebookLM播客化功能上线即爆火(2024Q2内部灰度测试TOP3功能首次公开)

更多请点击: https://intelliparadigm.com 第一章:NotebookLM文档播客化功能详解 NotebookLM 的文档播客化(Doc-to-Podcast)功能将静态文本内容智能转化为自然流畅的语音叙述,支持多角色配音、语速调节与上下文感知停…...

VMware Workstation Pro 17免费许可证密钥终极指南:快速激活专业虚拟化工具

VMware Workstation Pro 17免费许可证密钥终极指南:快速激活专业虚拟化工具 【免费下载链接】VMware-Workstation-Pro-17-Licence-Keys Free VMware Workstation Pro 17 full license keys. Weve meticulously organized thousands of keys, catering to all major …...

SKILLS All-in-one:开源AI Agent技能库,标准化Prompt与工具函数,提升开发效率

1. 项目定位与核心价值如果你和我一样,在过去一年里深度使用过 Claude Code、ChatGPT 或者尝试搭建自己的 AI Agent 工作流,那你一定遇到过这个痛点:每次想给 AI 装个新“技能”,都得自己从头写 Prompt、设计工具调用逻辑、处理错…...

从2013年光网络市场增长看100G与分组化技术演进

1. 从一篇旧闻说起:2013年光网络市场的“中国引擎”最近在整理一些老资料,翻到了EE Times在2013年9月的一篇市场分析报道。标题很直白,叫“中国驱动基础设施增长”。报道的核心数据是,光分组平台市场(包含光分组传输、…...

从零部署OpenClaw AI助手:多平台集成与私有化部署实战

1. 项目概述:从零部署你的专属AI助手 最近在折腾AI Agent,发现了一个挺有意思的开源项目叫OpenClaw。简单来说,它就像一个“万能接线员”,能把你的AI大模型(比如GPT、Claude、GLM这些)的能力,接…...

机器人学习中的物理驱动数据生成框架解析

1. 物理驱动数据生成框架解析在机器人学习领域,接触丰富的操作任务(如物体旋转、装配等)对数据质量提出了极高要求。传统基于轨迹优化的方法虽然能通过物理仿真生成动态可行的运动轨迹,但存在全局探索不足的问题。我们提出的创新框…...

从火箭背包到现代VTOL飞行器:FPGA飞控与传感器融合技术解析

1. 从科幻到现实:个人喷气背包的工程梦想每次看到老式喷气背包的影像,比如那些在早期007电影里出现的、两侧喷着火焰的装置,心里总会涌起一股混合着兴奋与敬畏的复杂情绪。那种感觉,就像小时候第一次拆开收音机,既惊叹…...

Display Driver Uninstaller:显卡驱动问题的终极解决方案

Display Driver Uninstaller:显卡驱动问题的终极解决方案 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers-uninstall…...

5个关键步骤掌握PyAEDT:从安装到高级仿真实战指南

5个关键步骤掌握PyAEDT:从安装到高级仿真实战指南 【免费下载链接】pyaedt AEDT Python Client Package 项目地址: https://gitcode.com/gh_mirrors/py/pyaedt PyAEDT作为Ansys Electronics Desktop的Python客户端库,为工程师提供了强大的电子设计…...

3分钟掌握罗技鼠标宏:PUBG自动压枪脚本终极指南

3分钟掌握罗技鼠标宏:PUBG自动压枪脚本终极指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为《绝地求生》中难以控制的枪械…...

如何使用DevPod打造你的终极开源云开发环境:完整指南

如何使用DevPod打造你的终极开源云开发环境:完整指南 【免费下载链接】devpod Codespaces but open-source, client-only and unopinionated: Works with any IDE and lets you use any cloud, kubernetes or just localhost docker. 项目地址: https://gitcode.c…...

从NOIP真题到日常刷题:手把手教你用C++分离数字并统计(以‘数字统计’题为例)

从竞赛真题到实战技巧:C数字分离与统计的深度解析 在信息学竞赛的入门阶段,很多初学者面对"数字统计"这类题目时,往往陷入两个极端:要么死记硬背标准答案,要么被看似复杂的循环结构吓退。实际上,…...