解放双手😭 在【Nest】中通过【TypeORM】连接数据库🤩

前言

数据库管理系统在企业和组织中扮演着至关重要的角色。它们提供了高效、可靠、安全的数据管理和存储机制,帮助组织管理海量数据并进行数据分析和决策。数据库管理系统的正确选择和优化可以极大提高数据处理的效率和可靠性,从而为业务带来更大的价值和竞争优势。🐙

MySQL

MySQL 是一个开源的关系型数据库管理系统,MySQL 作为一种数据库管理系统,它实现了大多数 SQL-92 标准的功能,同时也提供了许多其它的功能。

优点😘

  • 高性能:MySQL 采用了多种优化技术,能够快速地读写数据和处理并发访问。
  • 网络功能:MySQL 支持客户端/服务器模式,可以通过网络访问数据库。
  • 数据安全:MySQL 提供了多种安全功能,如密码保护、SSL 加密和权限管理等,可以保护数据不被非法访问和篡改。
  • 扩展性:MySQL 具有良好的扩展性,可以通过插件和存储引擎来扩展其功能。

总的来说,MySQL 是一个功能强大、性能高效、安全可靠的关系型数据库管理系统,被广泛地应用在各种领域。🤧但他也存在一些弊端。

缺点👨🏿‍🦽

  • 性能限制:在处理大规模复杂查询时,MySQL 的性能可能相对较低。尤其是在处理大量并发读写操作时,可能会出现性能瓶颈。
  • 扩展性限制:MySQL 的扩展性有一定限制。在需要处理非常大规模的数据或高并发的应用场景下,可能需要进行额外的配置和优化。
  • 事务处理:在 MySQL 的默认配置中,事务处理可能会受到一些限制。
  • 复杂性:对于不熟悉数据库管理系统的用户来说,要了解和使用 MySQL 的各种功能和性能优化技巧可能需要一些时间和学习成本。

ORM技术

基于MySQL的以上缺点,为了解放双手😭,研发出了 ORM 技术

定义

ORM(Object-Relational Mapping)是一种编程技术,它允许开发人员使用面向对象的编程语言(如Java、Python、C#等)来操作关系型数据库。

ORM 技术的基本思想是将数据库表中的记录映射为面向对象编程语言中的对象,同时也提供了逆向映射,将对象转换为关系型数据库中的记录。通过这种方式,开发人员可以使用对象和方法来操作数据库,而 无需直接编写 SQL 查询语句

TypeORM

而TypeORM 就是一个由 TypeScript 编写的功能强大的 对象关系映射(ORM)框架 ,它提供了一种简洁、灵活的方式来操作关系型数据库。TypeORM 支持多种数据库(如 MySQL、PostgreSQL、SQLite、Microsoft SQL Server 等),并且可以与各种 Node.js 框架(如 Express、NestJS)无缝集成。💯

优点

  • 强大的功能:TypeORM 提供了丰富的功能,包括实体管理、数据迁移、关联和查询、事务管理等。它是一个全功能的 ORM 框架,可以满足大多数项目的需求。💟

  • 良好的 TypeScript 支持:TypeORM 是使用 TypeScript 编写的,它充分发挥了 TypeScript 的优势,提供了类型安全、重构支持和更好的开发体验。

  • 多数据库支持:TypeORM 支持多种关系型数据库,如 MySQL、PostgreSQL、SQLite、Microsoft SQL Server 等。你可以轻松切换数据库,而无需更改代码。

  • 灵活的查询和关联:TypeORM 提供了丰富且灵活的查询和关联功能。你可以使用查询构建器(Query Builder)或查询语言(Query Language)来编写复杂的查询,处理实体之间的关联关系。这使得数据查询变得更加直观和易于理解。

总体而言,TypeORM 是一个功能强大、易于使用且具有良好的文档和社区支持的 TypeScript ORM 框架。无论是小型项目还是大型企业应用,TypeORM 都是一个可靠的选择,可以帮助你更高效地管理数据库操作,提高开发效率和代码质量。🏃🏿‍♀️

在Nest中使用TypeORM

说了这么多理论😖,接下来我们就来看看如何在在Nest中使用TypeORM👇

安装

安装 TypeORM 和相应数据库驱动程序

在你的 Nest 项目中执行以下命令来安装 TypeORM 及所需的数据库驱动程序(如 mysql、postgres 等)

js 复制代码
npm install typeorm @nestjs/typeorm mysql

配置数据库连接

在主模块(通常是 app.module.ts)中导入 TypeOrmModule 并配置数据库连接。

js 复制代码
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
  imports: [
    TypeOrmModule.forRoot({
      // 配置数据库连接信息
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'your_username',
      password: 'your_password',
      database: 'your_database',
      entities: [],
      synchronize: true, // 设置为 true 时,会自动创建数据表(仅用于开发环境)
    }),
  ],
})
export class AppModule {}

forRoot 方法中,你可以根据你的数据库配置设置数据库类型、主机、端口、用户名、密码和数据库名等信息。除了 synchronizeentities 是一个类型为实体数组的选项,你可以在其中列出你的数据表实体类。

创建实体类

在你的项目中创建实体类,用于映射到数据库表。例如,创建一个 User 实体类:

js 复制代码
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class User {
  @PrimaryGeneratedColumn() 
  id: number;
  
  @Column() 
  name: string;
  
  @Column() 
  age: number;
}

这是一个简单的 User 实体类,它具有 id、name 和 age 字段,并使用 @Entity@Column 装饰器来指定实体和属性的数据库映射。

在服务中使用 TypeORM

现在你可以在你的服务或控制器中使用 TypeORM,例如查询和保存数据。

js 复制代码
import { 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: Repository<User>,
  ) {}
  
  async findAll(): Promise<User[]> {
    return this.userRepository.find();
  }
  
  async findOne(id: number): Promise<User> {
    return this.userRepository.findOne(id);
  }
  
  async create(data: Partial<User>): Promise<User> {
    const user = this.userRepository.create(data);
    return this.userRepository.save(user);
  }
}

在上述例子中,我们使用 @InjectRepository(User) 注入了 User 实体的类型化存储库,并在 UserService 类中定义了一些基本的 CRUD 操作方法。

关联实体

js 复制代码
import { TypeOrmModule } from '@nestjs/typeorm';
import { Module } from '@nestjs/common';
import { User } from './user.entity';
import { UserService } from './user.service';
import { UserController } from './user.controller';

@Module({
  imports: [TypeOrmModule.forRoot(), TypeOrmModule.forFeature([User])],
  providers: [UserService],
  controllers: [UserController],
})
export class AppModule {}

现在,你可以在控制器中注入 UserService 并使用这些方法来处理与实体相关的操作。

创建控制器

js 复制代码
import { Controller, Get, Post, Body } from '@nestjs/common';
import { UserService } from './user.service';
import { User } from './user.entity';

@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Get()
  async findAll(): Promise<User[]> {
    return this.userService.findAll();
  }

  @Post()
  async create(@Body() data: Partial<User>): Promise<User> {
    return this.userService.create(data);
  }
}

这样,你就可以在 Nest 中使用 TypeORM 来操作数据库了。记得在实际开发中根据你的需求进行相应的配置和扩展,例如定义更多的实体类、配置关联关系、使用数据迁移等。

数据库可视化工具

另外,如果你使用的编译器是 VSCode ,那么可以安装一个数据库可视化工具👇

连接

  1. 打开左侧数据库面板, 点击添加按钮
  2. 在连接页面配置相应的数据库信息

数据表

通过上述方法使用TypeORM连接数据库后,即可获得类似如下的数据表

相关推荐
llz_11241 分钟前
web-第二次课后作业
前端·后端·web
cup116 小时前
[Full Clock 技术复盘] 一、浏览器前端如何实现百毫秒级时间校准?时间 API 推荐、模拟 NTP 算法原理及局限
typescript·开源·api·时钟·时间同步
红尘散仙7 小时前
我把终端小说阅读器接上了 AI Agent:TRNovel 现在能用 skill 生成书源了
人工智能·后端·rust
卷毛的技术笔记8 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
会编程的土豆8 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
喵个咪9 小时前
GoWind Toolkit Go后端代码生成 完整全流程实战
后端·go·orm
basketball6169 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
qq_2518364579 小时前
SpringBoot+Vue 共享电池柜管理系统 完整实现 前后端分离项目实战 完整代码
vue.js·spring boot·后端
zhangxingchao9 小时前
AI 大模型核心六:量化、Workflow 与 Agent、多轮 RAG
前端·人工智能·后端
梦想的颜色10 小时前
TypeScript 完全指南(上):从零开始掌握类型系统
前端·typescript