TypeORM 简单入门

2023-03-08 下午后端 54 次浏览暂无评论

前言

在使用NestJS过程中接触到了 TypeORM 这个ORM框架。

这里以一个 ToDoList 为案例,介绍一下这个库的使用。

中文文档:https://typeorm.bootcss.com/

安装和引入

安装

npm install --save @nestjs/typeorm typeorm mysql2

引入数据库

// app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      username: 'root',
      password: 'root',
      host: 'localhost',
      port: 3306,
      database: 'todolistdb',
      entities: [__dirname + '/**/*.entity{.ts,.js}'], //实体文件
      synchronize: true, //synchronize字段代表是否自动将实体类同步到数据库
      retryDelay: 500, //重试连接数据库间隔
      retryAttempts: 10, //重试连接数据库的次数
      autoLoadEntities: true, //如果为true,将自动加载实体 forFeature()方法注册的每个实体都将自动添加到配置对象的实体数组中
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule { }

建立todo对象

// src/todo/entities/todo.entity.ts
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";

@Entity()
export class Todo {
  // 自增列
  @PrimaryGeneratedColumn()
  id: number
  @Column()
  content: string
  @Column()
  status: boolean
}

增删改查

以一个简单的 ToDoList 为例

// src/todo/todo.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Result } from 'src/config/resultType';
import { Repository } from 'typeorm';
import { CreateTodoDto } from './dto/create-todo.dto';
import { UpdateTodoDto } from './dto/update-todo.dto';
import { Todo } from './entities/todo.entity';

@Injectable()
export class TodoService {
  constructor(@InjectRepository(Todo) private todoRepository: Repository<Todo>) { }

  async create(createTodoDto: CreateTodoDto) {
    let res = await this.todoRepository.insert(createTodoDto)
    return Result.success(res)
  }

  async findAll() {
    let res = await this.todoRepository.find()
    return Result.success(res)
  }

  async findOne(id: number) {
    let res = await this.todoRepository.findOne({ where: { id } })
    return Result.success(res)
  }

  async update(id: number, updateTodoDto: UpdateTodoDto) {
    let res = await this.todoRepository.update(id, updateTodoDto)
    return Result.success(res)
  }

  async remove(id: number) {
    let res = await this.todoRepository.delete(id)
    return Result.success(res)
  }
}
// src/config/resultType.ts
export enum stateCode {
  OK = 200,
  UNEXPECT = 400, //未知错误
  NEED_AUTH = 401, //需要登录
  NO_FIND = 402, //找不到相关资源
  BAD_REQUEST = 403, //请求错误
  EXISTED = 408, //字段已存在
  SEVER_ERR = 500, //服务器错误
}

export class Result {
  constructor(private code: stateCode,
    private data: Object | Array<any> | string | null,
    private msg: string
  ) { }
  public static success(data: Object | Array<any> | string | null) {
    return new Result(200, data, "success")
  }
  public static fail(code: stateCode, msg: string) {
    return new Result(code, null, msg)
  }
}


目录

安装和引入
建立todo对象
增删改查
ICP备案号:鲁ICP备2020040322号