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;
}
相关推荐
贺国亚1 小时前
Kafka 调优与运维实战
后端·kafka
何陋轩1 小时前
Spring AI + RAG实战:打造企业级智能问答系统
后端·算法·设计模式
IT当时语_青山师__JAVA技术栈1 小时前
动态代理深度解析:JDK与CGLIB底层实现与实战
java·后端·面试
SamDeepThinking1 小时前
别人写的代码看不懂,到底是谁的水平有问题
java·后端·程序员
Nyarlathotep01131 小时前
类加载机制(3):类加载器
jvm·后端
苏三说技术2 小时前
小米二面:Redis为什么能支撑10万+ QPS?
后端
平凡但不平庸的码农2 小时前
Go 语言基础语法
开发语言·后端·golang
是宇写的啊2 小时前
SpringBoot 统一功能处理
java·spring boot·后端
等....2 小时前
Spring Boot多模块项目部署
java·spring boot·后端