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;
}
相关推荐
李广坤2 分钟前
AgentScope Tool 热更新技术方案:不重启服务,实时管控 Agent 工具
后端·架构
ttwuai22 分钟前
Go 后台接入 SSO 后菜单正常但接口 403,怎么排查权限链路?
开发语言·后端·golang
65岁退休Coder1 小时前
LangChain v1.3.4 笔记 - 08 MCP & 相关概念
后端·python·langchain
郑州光合科技余经理1 小时前
海外版多语言团购系统架构:主数据互通与核销边界
java·开发语言·前端·后端·系统架构·php·ai编程
vipxieliang2 小时前
ValidX 的 Date 和 DateTime vs JPA 的 Temporal 对比
java·后端
触底反弹2 小时前
🔥 从「为什么」到「怎么用」:TypeScript 类型约束与泛型完全指南
后端·面试·typescript
用户8356290780512 小时前
使用 Python 查找和替换 Word 文档中的文本
后端·python
Java编程爱好者2 小时前
Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器
后端
神奇小汤圆2 小时前
从 ☕️Java Spring Boot → 🦀Rust Axum 体验的真实感受
后端
掘金者阿豪3 小时前
Codex 开放 1M 上下文后,我折腾了一圈才发现:新版根本不是网上教的那样配置
后端