typeorm

2022/02/26 后端 共 2852 字,约 9 分钟

Typeorm

Typeorm 是做把对象的操作通过 sql 同步为对数据库操作的 orm 的,而 Nest.js 是做 Web 后端应用的 MVC 分层以及通过 IOC 管理对象的创建和依赖的。

Typeorm 就是一个实现 orm 的框架,可以通过装饰器来描述映射关系,比如 @Entity(实体)、@Column(列)、@PrimaryGeneratedColumn(主键 ID 自动生成)

Typeorm与nest

Typeorm 和 Nest.js 的结合使用 @nestjs/typeorm 的包,它提供了一个 TypeormModule 的模块,有 forRoot 和 forFeature 两个静态方法。forRoot 方法用于生成连接数据库的 Module,forFeature 用于生成实体对应的 Repository 的 Module。

forRoot 用于创建数据库连接,传入一些配置参数,在入口 Module 引入。

@Module({ 
  imports: [ 
    TypeOrmModule.forRoot({ 
      type: 'mysql', 
      host: 'localhost', 
      port: 3306, 
      username: 'root', 
      password: '你的密码', 
      database: '数据库名', 
      synchronize: true 
    }), 
    NotesModule 
  ] 
}) 
export class AppModule {} 

forFeature 用于创建不同实体类对应的 Repository,在用到该实体的 Module 里引入。

@Module({ 
  imports: [TypeOrmModule.forFeature([Aaa])], 
  controllers: [AaaController], 
  providers: [AaaService], 
  exports: [AaaService] 
}) 
export class AaaModule {} 

Typeorm与数据库

Typeorm 是一个 ORM 框架,通过映射表和对象的对应关系,就可以把对对象的操作转换为对数据库的操作,自动执行 sql 语句。

用数据库从创建表开始。如何告诉 TypeORM 创建数据库表?答案是 - 通过模型。 应用程序中的模型即是数据库中的表。把数据库的操作即增删查改创建表等操作,对应typerom里面的api即可。

装饰器 => 创建表相关操作

其他几个即增删查改等相关操作

装饰器参考

https://zhimap.com/medit/b47ad455b41a46d8a49be0f373c9e2d1

实体是由 @Entity 装饰器装饰的模型 ,下面是创建一张数据表

import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";
@Entity()
export class Photo {
  @PrimaryGeneratedColumn()//主键 id 列自动生成
  id: number;
  
  @Column({
    length: 100
  })//数据类型
  name: string;//实体属性
  
  @Column("text")
  description: string;
  
  @Column('varchar', {

    name: 'name',// 数据库里面的字段
    nullable: true,
    comment: '组件名称',
    length: 255,
  })
  componentName: string | null; //别名
  
  @Column("double")
  views: number;
  
  @Column()
  isPublished: boolean;
}

QueryBuilder

https://zhimap.com/m/xTukxmiC

EntityManager API && Repository API

只列举一些常用的,没有全部一一列举

https://zhimap.com/medit/4c1a9f07ab504b368f60c2225626b07e

manager - EntityManager用于连接实体 ,使用EntityManager 你可以管理(insert, update, delete, load 等)任何实体。 EntityManager 就像放一个实体存储库的集合的地方。

getRepository获取给定实体的Repository你还可以指定表名,如果找到给定表的存储库,则会返回该表。 Repository就像Entity Manager一样,但其操作仅限于具体实体。

使用实体管理器EntityManager,使用储存库Repository,这两个东西有什么区别呢?

EntityManager就像单个位置上所有实体存储库的集合一样。而Repository虽然与

EntityManager类似,但是Repository操作仅限于具体实体,所以Repository需要传入实体来创建! emm,没什么不同。

所以API就不列举了

Repository API相比,QueryBuilder API非常強大且更接近SQL

Find 选项

QueryRunner

createQueryRunner创建一个查询运行器,用于在单个数据库连接上执行查询。

import { getConnection, QueryRunner } from 'typeorm';
const connection: Connection = getConnection();
const queryRunner: QueryRunner = connection.createQueryRunner();
 创建实例后QueryRunner使用connect来激活连接。 
import { getConnection, QueryRunner } from 'typeorm';
const connection: Connection = getConnection();
const queryRunner: QueryRunner = connection.createQueryRunner();
await queryRunner.connect(); // performs connection

由于QueryRunner用于管理隔离的数据库连接,因此请确保在不再需要它时释放它以使其再次可用于连接池。释放连接后,无法使用查询运行器方法。

在QueryRunner中有 3 种控制事务的方法:

startTransaction - 启动一个新事务。

commitTransaction - 提交所有更改。

rollbackTransaction - 回滚所有更改。

release 释放连接

QueryRunner 是处理一系列的操作叫事务,要么全部成功,这时候提交所有更改到数据库,只要有一个失败了就是失败了,要回滚之前的全部操作,这就是和QueryBuilder的区别

事务是一系列作为一个逻辑单元来执行的操作集合。它是数据库维护数据一致性的单位,它将数据库从一致状态转变为新的一致状态,说的简单一点就是,如果一组处理步骤要么全部发生要么一步也不执行,我们称该组处理步骤为一个事务。这样就保证了数据始终一致的状态,不至于破坏数据的完整性、可靠性


在技术的历史长河中,虽然我们素未谋面,却已相识已久,很微妙也很知足。互联网让世界变得更小,你我之间更近。

在逝去的青葱岁月中,虽然我们未曾相遇,却共同经历着一样的情愫。谁的青春不曾迷茫或焦虑亦是无奈,谁不曾年少过

在未来的日子里,让我们共享好的文章,共同学习进步。有不错的文章记得分享给我,我不会写好的文章,所以我只能做一个搬运工

我叫 sunseekers(张敏) ,千千万万个张敏与你同在,18年电子商务专业毕业,毕业后在前端搬砖

如果喜欢我的话,恰巧我也喜欢你的话,让我们手拉手,肩并肩共同前行,相互学习,互相鼓励

文档信息

Search

    Table of Contents