nest记笔五:使用TypeORM连接mysql

1,874 阅读2分钟

nestjs系列笔记

nestjs系列笔记

nest记笔五:使用TypeORM连接mysql

  • 这个比较简单,在之前的例子中,实际上已经连上了数据库了

1. 连接配置TypeORM

1.1 首先安装依赖包,@nestjs/typeorm, typeorm, mysql2

npm install --save @nestjs/typeorm typeorm mysql2

1.2 在项目根目录下,生成一个ormconfig.json文件

[
  {
    "type": "mysql",
    "host": "127.0.0.1",
    "port": 3306,
    "username": "root",
    "password": "",   // 你的数据库密码
    "database": "",   // 你的数据库
    "synchronize": false,
    "entities": ["entities/*.js"]
  }
]

1.2 安装完成后,需要在appModule里面导入TypeOrmModule.

// app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
  imports: [
    TypeOrmModule.forRoot(),  // typeorm默认使用ormconfig.json这个配置文件。 也可以能过forRoot的参数中确认
  ],
})
export class AppModule {}

1.3 直接在forRoot中填写配置的示例

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

@Module({
  imports: [
    TypeOrmModule.forRoot({  // 这里就是使用非ormconfig.json
    "type": "mysql",
    "host": "127.0.0.1",
    "port": 3306,
    "username": "root",
    "password": "",   // 你的数据库密码
    "database": "",   // 你的数据库
    "synchronize": false,
    "entities": ["dist/**/*.entity{ .ts,.js}"]  // 按照这里的配置,所有entity的对象可以自动注入,不需导入到任何模块了
    }),
  ],
})
export class AppModule {}

1.4 安装全局的typeorm-model-generator, 可以通过它来生成数据库表对应的entity代码。

npm install typeorm-model-generator -g
# 然后执行命令,按照提示,完成代码生成。
typeorm-model-generator

1.5 更多TypeORM连接配置

直接参考官网:typeorm.io/#/connectio…

2. entity 操作

2.1 准备

  • 第一步:生成user相关的代码
# nest详细的命令帮助: nest --help
# 生成user模块
nest g mo user  
# 生成相应的service
nest g s user
# 生成相应的controller
nest g co user
 
  • user.module.ts
import { Module } from '@nestjs/common';
import { UserService } from './user.service';
import { UserController } from './user.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';

@Module({
    imports: [TypeOrmModule.forFeature([User])], // 这里需要申明,就可以使用User这个实体了
    providers: [UserService],
    controllers: [UserController],
    exports: [TypeOrmModule],// 加上这行
})
export class UserModule {}

  • user.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';

@Injectable()
export class UserService {
    constructor(@InjectRepository(User) private usersRepository: Repository<User>) {}

    findAll() {
        return this.usersRepository.find();
    }

    findOne(id: number) {
        return this.usersRepository.findOne(id);
    }

    remove(id: number) {
        return this.usersRepository.delete(id);
    }
}
  • user.controller.ts
import { Body, Controller, Post } from '@nestjs/common';
import { XCommonRet } from 'xmcommon';
import { UserService } from './user.service';

@Controller('user')
export class UserController {
   constructor(private readonly userService: UserService) {}
   @Post('all')
   // @HttpCode(200)
   async all() {
       const r = new XCommonRet();
       r.setData(await this.userService.findAll());
       return r;
   }

   @Post('user')
   async getUser(@Body() param: { id: number }) {
       const r = new XCommonRet();
       r.setData(await this.userService.findOne(param.id));
       return r;
   }
}

2.2 生成实体

  • 使用下面SQL语句,生成数据库表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `firstName` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `lastName` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;
  • 使用typeorm-model-generator生成实体代码
// src/user/user.entity.ts
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity('user', { schema: 'orm' })
export class User {
    @PrimaryGeneratedColumn({ type: 'int', name: 'id' })
    id: number;

    @Column('varchar', { name: 'firstName', length: 255 })
    firstName: string;

    @Column('varchar', { name: 'lastName', length: 255 })
    lastName: string;

    @Column('int', { name: 'age' })
    age: number;
}
  • 将生成的user.ts复制到src/user/目录下,并改名为user.entity.ts

完后,就可以使用它做基本的数据库操作了。