笔记-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扩展。
相关推荐
亮子AI5 天前
【NestJS】为什么return不返回客户端?
前端·javascript·git·nestjs
小p5 天前
nestjs学习2:利用typescript改写express服务
nestjs
Eric_见嘉11 天前
NestJS 🧑‍🍳 厨子必修课(九):API 文档 Swagger
前端·后端·nestjs
XiaoYu200219 天前
第3章 Nest.js拦截器
前端·ai编程·nestjs
XiaoYu200221 天前
第2章 Nest.js入门
前端·ai编程·nestjs
实习生小黄21 天前
NestJS 调试方案
后端·nestjs
当时只道寻常24 天前
NestJS 如何配置环境变量
nestjs
濮水大叔1 个月前
VonaJS是如何做到文件级别精确HMR(热更新)的?
typescript·node.js·nestjs
ovensi1 个月前
告别笨重的 ELK,拥抱轻量级 PLG:NestJS 日志监控实战指南
nestjs