什么是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;
}