2-1:在NestJS中使用mikro-orm

什么是ORM?

简单来说,ORM 是为了让开发者在 TypeScript / JavaScript 等语言中,用对象、类、方法的方式操作关系型数据库,减少直接编写 SQL 的需求,同时获得类型提示、实体关系管理、迁移等工程化能力。

MIKRORM

就在上个月,MIKRORM刚刚发布了7.0版本,这是一次重大的版本更新。这篇文章就介绍了,如何在NestJS中使用最新的MIKORM

使用过程

1.创建NestJS项目

这一步略过,详情可以参考之前的创建过程

2.安装

来到MIKRORM的官网,可以看到它提供了多种的数据库安装,以postgres为例: 执行命令 pnpm add @mikro-orm/core @mikro-orm/nestjs @mikro-orm/postgresql

3.导入配置文件

官网提供的方式是直接在AppModule中导入。

js 复制代码
@Module({
  imports: [
    MikroOrmModule.forRoot({
      entities: ['./dist/entities'],
      entitiesTs: ['./src/entities'],
      dbName: 'my-db-name.sqlite3',
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

但是我认为这样的方式并不优雅,相当于把MikroOrm混杂在了AppModule中,并且这种配置方式只能作用在MIKRORM项目中,无法被Mikro-cli读取,因此我们这里采用单独创建MikroOrm配置文件的方式导入。

在根目录下创建mikro-orm.config.ts,同时写入:

js 复制代码
import { defineConfig } from '@mikro-orm/postgresql';

export default defineConfig({
  dbName: 'sqlite.db',
  debug: true,
});

然后安装Mikro-cli工具,执行命令:pnpm add @mikro-orm/cli -D。为了检测我们的项目能否识别到MikroORM配置,使用命令npx mikro-orm debug

此时我们会发现,根本检测不到!!这是V7版本的一大更新!V7版本加载Typescript的工具不再是ts-node而是tsx。之前能检测到的原因是NestJS项目本身就自带了ts-node。因此我们再装一下tsx,执行命令pnpm add tsx

为什么要做这个转变呢?(坑后续再填,我现在也不知道)

4.修改配置文件

我们需要MikrORM可以自动识别实体类,因此加入

js 复制代码
import { defineConfig } from '@mikro-orm/postgres';

export default defineConfig({
  entities: ['dist/**/*.entity.js'],
  entitiesTs: ['src/**/*.entity.ts'],
  // ...
});

5.建立数据库连接

V7无法自动的读取环境变量中的配置了,因此需要手动安装pnpm add dotenv -D,然后在配置文件中导入import 'dotenv/config'

接下来,在根路径下创建.env文件,文件内容如下

js 复制代码
//根据自己的数据库名称等信息填写
DB_NAME=postgres
DB_USER=postgres
DB_PASSWORD=123456
DB_HOST=localhost
DB_PORT=5432

然后在配置文件中显示的声明:

js 复制代码
import 'dotenv/config';
import { defineConfig } from '@mikro-orm/postgresql';
import { TsMorphMetadataProvider } from '@mikro-orm/reflection';
export default defineConfig({
  dbName: process.env.DB_NAME,
  password: process.env.DB_PASSWORD,
  port: Number(process.env.DB_PORT),
  host: process.env.DB_HOST,
  entities: ['dist/**/*.entity.js'],
  entitiesTs: ['src/**/*.entity.ts'],
  debug: true,
});

此时再次运行npx mikro-orm debug就会发现不仅能检测到我们的配置文件,还可以检测到实体类,并且数据库连接也是正常的

6.元数据反射配置

为啥需要它?TypeScript 有一个特性:在编译成 JavaScript 后,所有的类型信息都会消失 。MikroORM 需要知道该在数据库建什么类型的字段,JS 原生是做不到的。 安装pnpm add @mikro-orm/reflection

7.实体类上的装饰器

原本V6,将entity和Mikr-ORM配合起来,只需要在对应字段加上装饰器即可。但是在V7版本中,需要引入包import { Entity, PrimaryKey, Property } from '@mikro-orm/decorators/legacy';

js 复制代码
import { Entity, PrimaryKey, Property } from '@mikro-orm/decorators/legacy';
@Entity()
export class Todo {
  @PrimaryKey()
  id: number;
  @Property()
  title: string;
  @Property({ type: 'text' })
  content: string;
  @Property()
  isCompleted: boolean;
}
相关推荐
长栎4 分钟前
写 for 循环写了十年,你却从没用过迭代器模式最狠的那一面
后端
LiaCode8 分钟前
Redis 在生产项目的使用
前端·后端
用户5598224812212 分钟前
Docker Compose Down 导致容器数据误删——ext4 日志恢复全记录
后端
LiaCode13 分钟前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战14 分钟前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
xiaodaoluanzha33 分钟前
迄今為止,最簡單的編程語言 Nolang
前端·后端
Csvn34 分钟前
Docker 容器管理入门 — 从镜像到容器编排
后端
用户7623524259138 分钟前
ShardingJDBC
后端
行者全栈架构师39 分钟前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
Colin草率地做慢慢地改43 分钟前
关于QuickStore这个项目的重构(2)- 数据库建表文件
后端·面试·架构