NestJS中使用TypeORM

文章目录

  • 前言
      • 1. 最核心的几个装饰器(必须记住)
      • 2. NestJS 提供的 TypeORM 集成工具(@nestjs/typeorm 包)
      • 3. 常用 Repository 操作速查表
      • 4. 目前主流推荐的几种写法风格(2025~2026)
      • 5. 小Tips(非常实用)
    • 扩展🚀🚀🚀
      • 1. 迁移的核心概念(为什么要用迁移?)
      • 2. 推荐的项目结构(2025~2026 最常见布局)
      • 3. 现代推荐配置方式(2025-2026主流)
      • 4. 常用 CLI 命令(package.json 推荐配置)
      • 5. 迁移文件长什么样?(自动生成 vs 手动)
      • 6. 2025-2026 最佳实践总结表
      • 7. 快速诊断常见问题(2025-2026 仍然高频)

前言

NestJS中使用TypeORM是目前最主流、最成熟的数据库解决方案之一(2026年依然如此),TypeORM 是 Node.js 生态里最强大的 TypeScript 原生 ORM。

NestJS + TypeORM 开发中最常用的工具装饰器模式实用技巧

1. 最核心的几个装饰器(必须记住)

装饰器作用常用位置备注
@Entity()声明这是一个数据库表实体class可加参数:{ name: ‘custom_table’ }
@PrimaryGeneratedColumn()自增主键(推荐)property默认使用 increment
@PrimaryColumn()自定义主键(uuid、手动id等)property
@Column()普通字段property支持几乎所有类型参数
@CreateDateColumn()自动创建时间property
@UpdateDateColumn()自动更新时间property
@DeleteDateColumn()软删除时间(配合软删除使用)property
@ManyToOne()/@OneToMany()多对一 / 一对多关系property最常用关系
@OneToOne()一对一关系property常用于用户-资料、商品-详情等
@ManyToMany()+@JoinTable()多对多关系(必须在一方写@JoinTable()property非常常见:标签、角色、权限等

2. NestJS 提供的 TypeORM 集成工具(@nestjs/typeorm 包)

工具/方法用途使用位置推荐程度
TypeOrmModule.forRoot()全局数据库连接(推荐使用异步配置)AppModule★★★★★
TypeOrmModule.forRootAsync()异步配置(推荐!配合 ConfigModule)AppModule★★★★★
TypeOrmModule.forFeature([Entity])注册特定实体,让模块内可注入 RepositoryFeatureModule★★★★★
@InjectRepository(Entity)注入某个实体的 RepositoryService★★★★★
getRepositoryToken(Entity)手动提供自定义 Repository 时使用自定义 provider★★★

目前(2025~2026)最推荐的全局配置写法

// app.module.ts@Module({imports:[ConfigModule.forRoot({isGlobal:true}),TypeOrmModule.forRootAsync({imports:[ConfigModule],inject:[ConfigService],useFactory:(config:ConfigService)=>({type:'mysql',// 或 postgres、sqlite、mongodb...host:config.get('DB_HOST'),port:+config.get('DB_PORT'),username:config.get('DB_USERNAME'),password:config.get('DB_PASSWORD'),database:config.get('DB_DATABASE'),entities:[__dirname+'/**/*.entity.{ts,js}'],synchronize:config.get('NODE_ENV')!=='production',// 生产千万别开!logging:config.get('NODE_ENV')==='development'?['query','error']:false,timezone:'+08:00',// 很重要!中文项目建议加上}),}),// 其他模块...],})exportclassAppModule{}

3. 常用 Repository 操作速查表

// 最常用的几种写法(都在 service 里)// 1. 基本 CRUDawaitthis.repo.find()// 全部awaitthis.repo.findOneBy({id})// 找一条(推荐)awaitthis.repo.findBy({status:1})// 条件查找多条awaitthis.repo.save(entity)// 新增/修改(智能判断)awaitthis.repo.remove(entity)// 删除实体awaitthis.repo.softRemove(entity)// 软删除(需有 deletedAt 字段)// 2. 带关联查询(最常用写法)awaitthis.repo.find({where:{id},relations:['user','user.profile','tags'],// 嵌套也支持loadRelationIds:true,// 只加载 id(性能优化)})// 3. QueryBuilder(复杂查询必备)this.repo.createQueryBuilder('post').leftJoinAndSelect('post.user','user').leftJoinAndSelect('post.tags','tag').where('post.status = :status',{status:1}).andWhere('tag.name = :tagName',{tagName:'nestjs'}).orderBy('post.createdAt','DESC').skip(0).take(10).getMany()// 4. 事务(非常重要!)awaitthis.dataSource.transaction(asyncmanager=>{awaitmanager.save(User,user);awaitmanager.save(Profile,profile);// ...更多操作})

4. 目前主流推荐的几种写法风格(2025~2026)

风格优点缺点推荐场景
Active Record写起来最少代码实体类变得臃肿,耦合严重小型项目/快速原型
Repository模式最符合 NestJS 哲学,解耦最好代码量稍多中大型项目(最推荐)
QueryService统一查询入口,适合复杂查询学习成本稍高中后台系统、B 端系统
Custom Repository最高自由度,可封装复杂业务逻辑维护成本较高业务非常复杂时
AbstractService统一 CRUD 基类,减少重复代码过度抽象容易翻车团队规范强、实体非常多时

2025~2026 最主流推荐Repository 模式 + QueryBuilder + 事务的组合拳

5. 小Tips(非常实用)

  • 生产环境永远关闭synchronize: true
  • 强烈建议使用迁移(migrations)
  • 关联查询多的时候优先考虑loadRelationIds+ 二次查询
  • 性能敏感接口尽量少用relations,改用QueryBuilder精确控制
  • 软删除记得用withDeleted才能查到已删除数据
  • 大项目建议使用typeorm-extension或自己封装BaseRepository

扩展🚀🚀🚀

TypeORM Migrations是目前(2026年1月)在NestJS项目中最推荐的数据库模式演进方式,尤其是在生产环境中绝对不能使用synchronize: true

下面是目前最完整、最实用的 TypeORM 迁移指南(基于 TypeORM 0.3.x ~ 最新版本 + NestJS 10/11 生态):

1. 迁移的核心概念(为什么要用迁移?)

方式开发阶段生产环境数据安全性版本控制团队协作推荐程度 2026
synchronize: true非常方便极度危险经常丢数据灾难★☆☆☆☆
手动写 migration很安全安全最高很好★★★★☆
自动生成 migration方便+安全安全高(需审查)优秀★★★★★

2025-2026 主流结论开发阶段可以用 synchronize,生产必须关闭 + 使用迁移
最推荐的折中方案:自动生成 + 人工审查(90%以上的团队都这么做)

2. 推荐的项目结构(2025~2026 最常见布局)

src/ ├── database/ # 独立数据库相关 │ ├──>3. 现代推荐配置方式(2025-2026主流)

创建src/database/data-source.ts(非常重要!CLI 要用它)

// src/database/data-source.tsimport{DataSource}from'typeorm';import*asdotenvfrom'dotenv';dotenv.config();exportconstAppDataSource=newDataSource({type:'postgres',// 或 mysql, mariadb, sqlite...host:process.env.DB_HOST||'localhost',port:Number(process.env.DB_PORT)||5432,username:process.env.DB_USERNAME||'postgres',password:process.env.DB_PASSWORD||'postgres',database:process.env.DB_NAME||'mydb',// 重要:生产一定用 js,已编译后的文件entities:['dist/**/*.entity{.ts,.js}'],migrations:['dist/database/migrations/*{.ts,.js}'],// 强烈建议:synchronize:false,// 生产必须 false!logging:process.env.NODE_ENV==='development',migrationsRun:false,// 不要在应用启动时自动跑(推荐手动或 pipeline 控制)// 可选但非常推荐(尤其 postgres/mysql)extra:{max:30,// 连接池大小connectionTimeoutMillis:2000,},});// 方便开发时直接用 ts-node 执行exportdefaultAppDataSource;

4. 常用 CLI 命令(package.json 推荐配置)

"scripts":{"typeorm":"ts-node ./node_modules/typeorm/cli.js --dataSource src/database/data-source.ts","typeorm:prod":"node --require tsconfig-paths/register ./node_modules/typeorm/cli.js --dataSource dist/database/data-source.js","migration:generate":"npm run typeorm migration:generate src/database/migrations/$npm_config_name","migration:create":"npm run typeorm migration:create src/database/migrations/$npm_config_name","migration:run":"npm run typeorm migration:run","migration:revert":"npm run typeorm migration:revert","migration:run:prod":"npm run typeorm:prod migration:run"}

使用方式示例

# 生成迁移(推荐!)npmrun migration:generate --name=AddUserLastLogin# 空迁移(需要自己写复杂逻辑时)npmrun migration:create --name=ComplexDataMigration# 运行所有待执行迁移npmrun migration:run# 回滚最近的一次迁移npmrun migration:revert

5. 迁移文件长什么样?(自动生成 vs 手动)

自动生成的典型样子(最常见):

import{MigrationInterface,QueryRunner}from"typeorm";exportclassAddUserLastLogin1723456789012implementsMigrationInterface{publicasyncup(queryRunner:QueryRunner):Promise<void>{awaitqueryRunner.query(`ALTER TABLE "users" ADD "lastLogin" timestamp`);}publicasyncdown(queryRunner:QueryRunner):Promise<void>{awaitqueryRunner.query(`ALTER TABLE "users" DROP COLUMN "lastLogin"`);}}

手动迁移常见场景(自动生成做不到或不安全时):

  • 大批量数据更新/转换
  • 复杂列类型转换(jsonb → 拆分成多列)
  • 表重命名 + 数据迁移
  • 添加/删除外键约束(带级联)
  • 插入/更新初始数据(部分团队会放在 migration 里)

6. 2025-2026 最佳实践总结表

实践推荐度说明
生产环境永远synchronize: false★★★★★否则极易丢数据
使用单独的data-source.ts★★★★★CLI 和应用共用配置,避免重复
migration 文件放dist/里运行★★★★☆部署后才能执行(生产必须编译后的 js)
每次生成后必须人工 review★★★★★自动生成有时会产生危险操作(如 drop column)
迁移 + CI/CD pipeline 执行★★★★☆推荐在 deploy 时自动跑 migration:run
不要在 migration 里依赖服务★★★★☆migration 类不能使用 NestJS DI(独立执行)
复杂数据迁移考虑使用typeorm-extensiondb:seeders★★★☆☆分离 schema 变更和数据填充
团队约定迁移命名规范★★★★☆e.g.AddUserProfileFields_20250110
永远保留down方法完整可执行★★★★☆便于测试回滚和环境重建

7. 快速诊断常见问题(2025-2026 仍然高频)

问题原因解决方式
生成迁移时把所有表都重新生成了数据库和实体不匹配 / 命名大小写检查数据库名、表名大小写,清理typeorm_metadata
迁移运行时报relation does not exist迁移顺序错乱删除migrations表记录 + 重新跑
生产环境迁移没执行没编译成 js / 路径错误使用typeorm:prod脚本 + 检查dist路径
Cannot find entityentities 路径不对确认dist/**/*.entity.js

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1140200.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HY-MT1.5-1.8B在Docker部署?容器化最佳实践

HY-MT1.5-1.8B在Docker部署&#xff1f;容器化最佳实践 近年来&#xff0c;随着多语言交流需求的快速增长&#xff0c;高质量、低延迟的翻译模型成为AI应用落地的关键组件。腾讯开源的混元翻译大模型HY-MT1.5系列&#xff0c;凭借其卓越的翻译性能和灵活的部署能力&#xff0c…

救命神器2026 TOP10 AI论文软件:继续教育必备测评与推荐

救命神器2026 TOP10 AI论文软件&#xff1a;继续教育必备测评与推荐 2026年学术写作工具测评&#xff1a;为何需要一份精准指南 在继续教育与科研领域&#xff0c;论文撰写已成为一项不可或缺的核心任务。然而&#xff0c;面对日益繁重的学术压力&#xff0c;传统写作方式已难…

HY-MT1.5-7B部署实战:混合语言场景下的翻译质量优化

HY-MT1.5-7B部署实战&#xff1a;混合语言场景下的翻译质量优化 在多语言交流日益频繁的今天&#xff0c;高质量、低延迟的机器翻译模型成为跨语言沟通的核心基础设施。腾讯混元团队推出的 HY-MT1.5 系列翻译大模型&#xff0c;凭借其对混合语言场景的深度优化和强大的多语言支…

HY-MT1.5部署常见错误汇总:新手避坑实战指南(附解决方案)

HY-MT1.5部署常见错误汇总&#xff1a;新手避坑实战指南&#xff08;附解决方案&#xff09; 混元翻译大模型HY-MT1.5是腾讯开源的新一代高性能翻译模型&#xff0c;专为多语言互译场景设计。该模型系列包含两个核心版本&#xff1a;参数量为18亿的HY-MT1.5-1.8B和70亿的HY-MT…

Hunyuan MT1.5-1.8B工业级部署:Kubernetes集群实战

Hunyuan MT1.5-1.8B工业级部署&#xff1a;Kubernetes集群实战 1. 引言 1.1 背景与业务需求 随着全球化进程加速&#xff0c;多语言内容的实时翻译需求在跨境电商、国际客服、跨国协作等场景中日益增长。传统云翻译服务存在延迟高、数据隐私风险和网络依赖等问题&#xff0c…

HY-MT1.5-7B为何更强?上下文理解能力在部署中的体现

HY-MT1.5-7B为何更强&#xff1f;上下文理解能力在部署中的体现 1. 背景与技术演进&#xff1a;混元翻译模型的升级之路 随着全球化进程加速&#xff0c;高质量、多语言互译需求日益增长。传统翻译模型在面对混合语言、复杂语境或专业术语时&#xff0c;往往出现语义偏差、格…

混元翻译1.5模型评测:方言翻译专项测试报告

混元翻译1.5模型评测&#xff1a;方言翻译专项测试报告 1. 引言 随着多语言交流需求的不断增长&#xff0c;高质量、低延迟的机器翻译系统成为跨语言沟通的核心基础设施。腾讯近期开源了其混元翻译大模型1.5版本&#xff08;HY-MT1.5&#xff09;&#xff0c;包含两个关键模型…

四轮轮毂电机驱动车辆驱动电机故障状态估计UKF(Matlab/Simulink源码及建模说明)

四轮轮毂电机驱动车辆&#xff0c;驱动电机故障状态估计&#xff08;UKF&#xff09; 软件使用&#xff1a;Matlab/Simulink 适用场景&#xff1a;采用无迹卡尔曼滤波UKF进行轮毂电机状态估计&#xff0c;失效电机估计状态为0&#xff0c;正常电机状态为1。 产品simulink源码包…

AI论文写作内幕揭秘:9款神器助你一键搞定知网维普查重,不留AIGC痕迹

开头&#xff1a;90%的学生不知道的论文“潜规则”&#xff0c;正在被AI改写 你是否经历过&#xff1a; 熬夜改稿3天&#xff0c;导师一句“逻辑混乱”打回重写&#xff1f; 知网查重率28%&#xff0c;降重改到怀疑人生&#xff1f; 用ChatGPT写的段落&#xff0c;被维普的“A…

HY-MT1.5-7B高并发部署方案:多请求处理性能优化实战

HY-MT1.5-7B高并发部署方案&#xff1a;多请求处理性能优化实战 1. 引言 随着全球化进程的加速&#xff0c;高质量、低延迟的机器翻译服务已成为跨语言交流的核心基础设施。腾讯开源的混元翻译大模型&#xff08;HY-MT1.5&#xff09;系列&#xff0c;凭借其在多语言互译、混…

HY-MT1.5多语言支持:33种语言互译技术揭秘

HY-MT1.5多语言支持&#xff1a;33种语言互译技术揭秘 随着全球化进程加速&#xff0c;跨语言沟通需求日益增长。传统翻译模型在多语言互译、小语种覆盖和复杂语境理解方面存在明显短板&#xff0c;尤其在边缘设备部署和实时响应场景中面临性能与精度的双重挑战。腾讯推出的混…

HY-MT1.5网页推理教程:快速体验多语言翻译服务

HY-MT1.5网页推理教程&#xff1a;快速体验多语言翻译服务 随着全球化进程的加速&#xff0c;高质量、低延迟的多语言翻译服务成为跨语言交流的核心需求。腾讯近期开源了其最新的混元翻译大模型系列——HY-MT1.5&#xff0c;包含两个版本&#xff1a;HY-MT1.5-1.8B 和 HY-MT1.…

收藏!AI裁员潮下,程序员/小白进阶大模型“超级个体”指南

2024-2025年的科技圈&#xff0c;正被一场AI驱动的效率革命深刻重塑&#xff0c;裁员潮与AI热并存成为独特景观。企业端集体从“人力密集”转向“算力密集”&#xff0c;资本对AI的追捧看似狂热&#xff0c;但冰冷数据揭示&#xff1a;95%的组织AI投资都未能获得回报&#xff0…

Qwen3-VL敏感内容过滤:预装安全模块,合规使用无忧

Qwen3-VL敏感内容过滤&#xff1a;预装安全模块&#xff0c;合规使用无忧 1. 为什么教育机构需要内容过滤&#xff1f; 教育机构在使用AI模型时最担心的就是生成不当内容。想象一下&#xff0c;如果学生在课堂上使用AI助手时突然出现不适宜的信息&#xff0c;那将是一场教学事…

混元1.5翻译模型:质量与速度平衡之道

混元1.5翻译模型&#xff1a;质量与速度平衡之道 随着全球化进程的加速&#xff0c;高质量、低延迟的机器翻译需求日益增长。传统翻译模型往往面临“大模型精度高但部署难&#xff0c;小模型速度快但质量差”的两难困境。腾讯推出的混元翻译模型 1.5 版本&#xff08;HY-MT1.5…

HY-MT1.5-1.8B模型应用:IoT设备集成

HY-MT1.5-1.8B模型应用&#xff1a;IoT设备集成 1. 引言 随着物联网&#xff08;IoT&#xff09;设备在全球范围内的快速普及&#xff0c;跨语言交互需求日益增长。从智能家居到工业自动化&#xff0c;设备需要理解并响应多语言指令&#xff0c;提供本地化的用户界面与服务。…

实战万能卡片 (Service Widget):如何让你的 App 驻留在用户的桌面上,日活提升 200%?

&#x1f4c9; 前言&#xff1a;图标是死的&#xff0c;卡片是活的 传统 App 图标&#xff1a;只是一个冷冰冰的入口。用户不点开&#xff0c;永远不知道里面发生了什么。万能卡片&#xff1a;是一个动态的窗口。电商 App&#xff1a;直接在桌面显示“您的快递还有 500米 到达”…

SpringMVC-参数传递(5加2)及响应

一.参数传递1.普通参数类型Spring MVC会自动将请求中的查询参数&#xff08;如?nameJohn&age25&#xff09;映射到方法的参数上&#xff0c;要求参数名称和请求中的参数名称相同。这里&#xff0c;name和age是请求中的参数&#xff0c;Spring会根据参数名自动将其值传递给…

Hunyuan翻译模型实战对比:HY-MT1.5 vs DeepL API谁更强?

Hunyuan翻译模型实战对比&#xff1a;HY-MT1.5 vs DeepL API谁更强&#xff1f; 在大模型驱动的自然语言处理浪潮中&#xff0c;机器翻译正从“通用可用”迈向“精准可控”的新阶段。腾讯近期开源的混元翻译模型 1.5&#xff08;Hunyuan MT 1.5&#xff09;系列&#xff0c;凭…

腾讯HY-MT1.5翻译模型:企业级部署架构设计

腾讯HY-MT1.5翻译模型&#xff1a;企业级部署架构设计 1. 引言&#xff1a;从开源大模型到企业级落地 随着全球化业务的加速推进&#xff0c;高质量、低延迟的机器翻译能力已成为企业出海、跨语言服务和多模态内容处理的核心基础设施。腾讯近期开源的混元翻译大模型 HY-MT1.5 …