笔记-TypeORM

一.ORM是什么?


定义ORM ( Object Relational Mapping) 对象关系映射,其主要作用是在编程中,把面向对象的概念跟数据库中的概念对应起来。

举例 :定义一个对象,那就对应着一张表,这个对象的实例,就对应着表中的一条记录

传统SQL

sql 复制代码
SELECT id, first_name, last name, phone, birth_date, sex FROM persons
WHERE id = 10

res = db.execSql(sql)
name = res[O] ['FIRST_NAME']

ORM写法

typescript 复制代码
p = Person.get(10)
name = p.first_name

为什么使用ORM?

当我们实现一个应用程序时(不使用O/R Mapping),我们可能会写特别多数据访问层的代码,从数据库保存、删除、读取对象信息,而这些代码都是重复的。

而使用ORM则会大大减少重复性代码。对象关系映射(Object Relational Mapping,简称ORM),主要实现程序对象到关系数据库数据的映射。

特点

  • 方便维护:数据模型定义在同一个地方,利于重构
  • 提高开发效率,降低开发成本
  • 代码量少、对接多种库:代码逻辑更易懂
  • 工具多、自动化能力强:数据库删除关联数据、事务操作等

缺点

  • 自动化进行关系数据库的映射需要消耗系统性能。其实这里的性能消耗还好啦,一般来说都可以忽略之。
  • 在处理多表联查、where条件复杂之类的查询时,ORM的语法会变得复杂。

二.数据库相关概念


关系型数据库,是指采用了关系模型来组织数据的数据库。

NoSQL是对不同于传统的关系数据库的数据库管理系统的统称。

啥是关系模型?

关系模型本质上就是若干个存储数据的二维"表"

什么是ERD图?

数据库相关工具

常见数据库

关系型数据库特点

  • 优点:易于维护、使用方便、支持复杂查询效率高
  • 缺点:读写性能差,灵活性差
  • 场景:各类业务系统、管理系统、安全性较高的场景

非关系型数据库特点

  • 优点:易于扩展,大文件仔储,查询速度快
  • 缺点:复杂计算与联合查询效率低
  • 场景:多格式&海量数据、分布式消息系统、统计排行

三.TypeORM使用


TypeORM 无疑是 node.js 世界中最成熟的对象关系映射器(ORM

由于它是用 TypeScript 编写的,所以它在 Nest 框架下运行得非常好。

安装依赖

bash 复制代码
pnpm i --save @nestjs/typeorm typeorm mysql2

封装database提供者函数,设置配置项,数据库连接Connection

database.providers.ts

typescript 复制代码
import { DataSource } from 'typeorm';

export const databaseProviders = [
  {
    provide: 'DATA_SOURCE',
    useFactory: async () => {
      const dataSource = new DataSource({
        type: 'mysql',
        host: 'localhost',
        port: 3306,
        username: 'root',
        password: 'root',
        database: 'test',
        entities: [
            __dirname + '/../**/*.entity{.ts,.js}',
        ],
        //同步本地的schema与数据库 -> 初始化的时候去使用
        synchronize: true,
      });

      return dataSource.initialize();
    },
  },
];

在database模块中使用提供者

database.module.ts

typescript 复制代码
import { Module } from '@nestjs/common';
import { databaseProviders } from './database.providers';

@Module({
  providers: [...databaseProviders],
  exports: [...databaseProviders],
})
export class DatabaseModule {}

存储库模式

TypeORM 支持存储库设计模式,因此每个实体都有自己的存储库。这些存储库可以从数据库连接中获取。

首先,我们需要一个实体,建立Photo 实体。

photo.entity.ts

typescript 复制代码
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class Photo {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({ length: 500 })
  name: string;

  @Column('text')
  description: string;

  @Column()
  filename: string;

  @Column('int')
  views: number;

  @Column()
  isPublished: boolean;
}

数据库连接是 异步的 ,但 Nest 使最终用户完全看不到这个过程。PhotoRepository 正在等待数据库连接时,并且PhotoService 会被延迟,直到存储库可以使用。整个应用程序可以在每个类实例化时启动。

photo.module.ts

typescript 复制代码
import { Module } from '@nestjs/common';
import { DatabaseModule } from '../database/database.module';
import { photoProviders } from './photo.providers';
import { PhotoService } from './photo.service';

@Module({
  imports: [DatabaseModule],
  providers: [
    ...photoProviders,
    PhotoService,
  ],
})
export class PhotoModule {}

四.Prisma对比TypeORM

虽然 Prisma 和 TypeORM 解决了类似的问题,但它们的工作方式却截然不同。

TypeORM 是一种传统的 ORM,它将 映射到模型类。这些模型类可用于生成 SQL 迁移。然后,模型类的实例在运行时为应用程序提供 CRUD 查询的接口。

Prisma是一种新型 ORM,可以缓解传统 ORM 的许多问题,例如模型实例臃肿、业务与存储逻辑混合、缺乏类型安全或由延迟加载等导致的不可预测的查询。

Prisma的优势:

  • 更精简:Prisma的目标是尽可能简化开发,让开发者更专注于业务逻辑而非数据访问层。
  • 更易于学习:Prisma的语法更加清晰和简单,相对TypeORM来说更容易上手。
  • 强类型支持:Prisma使用TypeScript作为底层语言,提供严格类型支持,可以减少在底层和数据模型之间发生的错误。
  • 更好的性能:Prisma使用批量查询和预加载等技术,可以大大提升数据库访问性能,避免了N+1查询等性能问题。
  • 支持访问关系数据库、MongoDB和GraphQL数据源。

TypeORM的优势:

  • 更加成熟:TypeORM在市场上已经存在较长时间,具有更广泛的用户群体和更周全的文档和社区支持。
  • 支持多种数据库类型:TypeORM支持关系型数据库和一些NoSQL数据库,如MySQL、PostgreSQL、Oracle、MongoDB等。
  • 丰富的特性:TypeORM提供了广泛的特性,如实体、仓储、查询构建器等,可以满足各种应用程序的需求。
  • 易扩展性:TypeORM提供了广泛的插件和模块,可以扩展和自定义其功能。
  • 支持在浏览器中使用:TypeORM提供了可在浏览器中使用的版本,可以用于Web应用程序和Web扩展。
相关推荐
前端杂货铺10 小时前
NestJS——日志、NestJS-logger、pino、winston、全局异常过滤器
nestjs·日志
林太白20 天前
NestJS用户模块CRUD和分页实现
前端·javascript·nestjs
plusone20 天前
【Nest指北系列-源码】(一)目录结构
nestjs
前端笨鸟1 个月前
NestJS+MongoDB高效CRUD接口开发全景指南
前端·mongodb·nestjs
前端实习生鲸落1 个月前
nest 静态文件打包
前端·node.js·nestjs
汪小成1 个月前
NestJS学习笔记-03-使用class-validator进行接口参数校验🚀
后端·nestjs
汪小成1 个月前
NestJS学习笔记-02-模块、控制器与服务,手把手构建你的第一个CRUD API!🚀
后端·nestjs
汪小成1 个月前
NestJS学习笔记-01-第一个Nest应用诞生记 🚀
后端·nestjs
plusone1 个月前
【Nest指北系列】守卫
nestjs
用户11481867894841 个月前
大文件下载、断点续传功能
前端·nestjs