文章概叙
本文大概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
求关注~希望能帮到你