NestJS必备:TypeORM对DB的操作

文章概叙

本文大概1300字,讲的是一些关于TypeORM的基础知识以及在NestJS中使用TypeORM操作DB的例子。

关于TypeORM

TypeORM 是一个ORM框架,它可以运行在 NodeJS、Browser、Cordova、PhoneGap、Ionic、React
Native、Expo 和 Electron 平台上,可以与 TypeScript 和 JavaScript
(ES5,ES6,ES7,ES8)一起使用。

TypeORM的目标是始终支持最新的 JavaScript 特性并提供额外的特性以帮助你开发任何使用数据库的(不管是只有几张表的小型应用还是拥有多数据库的大型企业应用)应用程序。

在NestJS看来,TypeORM是可用于 TypeScript 的最成熟的对象关系映射器 (ORM)。且由于使用 TypeScript 编写,所以可以很好地与 Nest 框架集成。

实体与数据表

在介绍TypeORM的使用之前,需要先介绍下TypeORM是怎么跟我们的DB互动的。

在TypeORM中,存在一类后缀名为 entity.ts 的文件,我们称其为实体类文件,该类型文件记录着我们的字段 以及一些表之间的映射关系。一般结构如下:
在这里插入图片描述

其中,第十一行的 @Entity() 表示我们的表名为traning_plan.

第十四行中,我们创建了一个名字为 traning_plann_name 的字段,且该字段的长度为128,该字段为唯一id.

第十五行我们为这个第十四行的字段起了一个别名为name,我们在代码中要对这个字段做操作的时候,我们都会用name来操作这个字段,且该字段的类型为string。

在这样的情况下,我们就在我们的代码中创建好了一个又一个实体类,分别代表我们数据库中的每一个表。
当我们在配置TypeORM的时候,如果设置了synchronize为true,那么我们就会在DB中重新创建一张又一张新的表,这么一个过程,我们称之为Mapping,也就是映射,所以对于这个开关,我们一般会选择在dev的时候开启,在prod的时候关闭,主打的就是一个安全。。。。
在这里插入图片描述

TypeORM的配置

在使用TypeORM前,照例先贴上包的版本

"typeorm": "^0.3.17",
"@nestjs/typeorm": "^10.0.0",

由于我们一般使用的是NestJS的脚手架安装项目,所以不需要纠结TypeORM的版本。

在开发的概念中,TypeORM属于一个module,所以我们会将在 app.module.ts中去引入TypeORM模块。具体代码如下:

@Module({
  imports: [
    // TypeORM configuration
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: database.host,
      port: database.port,
      username: database.username,
      password: database.password,
      database: database.name,
      autoLoadEntities: true,
      synchronize: !isInCXEnvironment && process.env.NODE_ENV === 'development',
      ssl: false, 
    }),
})

首先,TypeORM会导出TypeOrmModule,并且内含一个forRoot的方法使我们去配置database的参数。

我们除了需要配置数据库的类型以及账号密码等,还需要注意synchronize参数,表示是否将本地的配置Mapping到DB上,可以理解为是否根据代码中的字段来创建表,要慎重!!!很容易就将线上的字段干掉了。

而autoLoadEntities是属于NestJS中特有的一个属性,表示是否自动加载实体类。一般都是开着的,由于本文是NestJS中去使用TypeORM,所以也就提一嘴这个属性。

使用TypeORM

前面的例子中已经介绍了TypeORM的一些基础知识以及如何配置,现在介绍下在NestJS项目中如何使用TypeORM操作我们的数据库。
当我们的项目中使用了TypeORM的时候,启动项目后 ,我们会在控制台中看到如下的提示,表示我们已经链接到了DB中。
在这里插入图片描述

在NestJS的代码结构中,我们对于DB的操作,会放在services文件中,所以接下来,我们需要在services中对DB进行操作。

@Injectable()
export class PlanService {
  constructor(
    @InjectRepository(Plan)
    private planRepository: Repository<Plan>,
) {}
}

其中,我们使用了第四行的InjectRepository去注解我们的实体

在使用了第五行的实例化对象后,我们可以在后续的代码中使用planRepository去操作我们的DB了。

举一个简单的例子,下面的代码表示了我们去查找到db中最符合的一条数据。

return await this.repository.findOne({
  where: { id: id }
});

ok,本文到此结束,感谢各位看官。

对于其他的配置,觉得有需要记下来的,则会诞生出别的博客,本文主要让一些新手了解TypeORM

公众号链接
在这里插入图片描述

求关注~希望能帮到你

  • 21
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值