NestJS 使用 TypeORM

3,651 阅读2分钟

「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战

ORM

ORM 对象-关系映射 Object-Relational Mapping

通过使用对象和数据库之前映射的元数据,将程序中的对象自动持久化到关系数据库中。通过实例对象的语法去操作数据库。

映射关系:

  • 表 : 类
  • 记录 :对象
  • 字段 :对象属性

使用 ORM 可以不仅可以提高开发效率,数据访问更加抽象、轻便,支持面向对象封装。因为我们统一定义数据模型,更易更新和维护,且有利于代码重用。现有很多ORM 框架可以使用,可以让我们更专注业务逻辑的处理。

有优点自然也存在缺点。比如:

  • 性能不如原生SQL
  • 可能存在一些特殊业务场景,而使用ORM 可能无法定制部分SQL语句

TypeORM集成

TypeORM是 TypeScript 中最成熟的对象关系映射器,它可以很好地与 Nest 框架集成。

详细使用可以看 TypeORM中文文档,这里介绍在Nestjs中使用 TypeORM

安装所需的依赖包,这里是以mysql2 为例。 TypeORM 提供了对许多关系数据库的支持,比如 PostgreSQLOracleMicrosoft SQL ServerSQLite,甚至像 MongoDB这样的 NoSQL 数据库

 npm install --save @nestjs/typeorm typeorm mysql2

mysql 数据可以使用Docker安装一个MySQL镜像

docker run --name {your_mysql_name} -e MYSQL_ROOT_PASSWORD={your_password} -d -p {port}:3306 mysql

实体对应

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
​
@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;
​
  @Column()
  firstName: string;
​
  @Column()
  lastName: string;
​
  @Column({ default: true })
  isActive: boolean;
}
​

自动载入实体

Nestjs 框架支持配置autoLoadEntities 这一选项,使得每个通过forFeature()注册的实体都会自动添加到配置对象的entities数组中

@Module({
  imports: [
    TypeOrmModule.forRoot({
      ...
      autoLoadEntities: true,
    }),
  ],
})
export class AppModule {}

事务

typeORM 当然也是支持事务的,以下代码是创建事务,然后将所运行的所有内容都在事务的回调内执行。

await getManager().transaction(async transactionalEntityManager => {
  await transactionalEntityManager.save(users);
  // ...
});

详细的使用可以通过操作手册。typeORM其实提供很多功能,数据之间的关系,多个数据库连接等。

NestJs重学系列整合

参考资料: