当前位置: 首页 > 工具软件 > core-nestjs > 使用案例 >

nestjs连接mysql数据库的方法与使用

苏法
2023-12-01

0. 版本要求

nestJs连接mysql数据库是有一定的版本要求的。(因为使用的是mysql2模块,来连接的mysql,所以会出现因数据库版本太低而连接失败的情况)
mysql数据库版本:>= v5.6.0;条件允许的情况下,尽量选择最新稳定版本的数据库版本。

1. 安装依赖包

通过npm上的比较成熟的依赖包进行数据库的连接,可以节省我们的代码量。更能较少我们的开发时间。也能使我们的代码更加简洁。
这里我们需要用的几个依赖包:mysql2 @nestjs/typeorm

cnpm i mysql2 @nestjs/typeorm -S

mysql2模块我们可以用来连接mysql。
typeorm是一个ORM框架。它的目标是始终支持最新的 JavaScript 特性并提供额外的特性以帮助你开发任何使用数据库的(不管是只有几张表的小型应用还是拥有多数据库的大型企业应用)应用程序。文档地址:https://typeorm.bootcss.com/

2. 连接

nestJs文档上有有关连接数据库的方式。连接:https://docs.nestjs.cn/8/techniques
在文档上有不止一种的连接方式。这里我使用了其中一种。当然对于数据库的信息我们可以定义到一个配置文档中,然后通过配置引入变量来实现统一的配置信息。但是在这里为了方便阅读,直接就以字符串的方式进行展示了。
app.module.ts

import { Module } from '@nestjs/common';
import { APP_FILTER } from '@nestjs/core';
import { TypeOrmModule } from '@nestjs/typeorm';

import { NodeInfoModule } from './modules/nodeInfo/nodeInfo.module';

@Module({
  imports: [
 	// 这里可以用来引入自己的模块
    NodeInfoModule,
    // 数据库的连接信息
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'lljk',
      entities: [__dirname + '/./**/*.entity.{js,ts}'],
      synchronize: true,
      timezone: 'Z',
    }),
  ],
})
export class AppModule {}

这里有一个坑:因为nest加载回去.dist文件夹下去执行文件,所以这里我们的entities配置需要根据需要进行相应改变。像上面我直接在app.module.ts中使用。我的app.module.ts和其他的模块文件夹是在同一个目录级别的,所以__dirname后面之际使用/去查找相应的entity文件就行。但是如果我们使用的是在配置文件引入的方式,就需要根据配置文件所在位置,相应的去改变文件的查找层次了。否则编译过程中会出现报错的情况。

模块中使用

我们与controller模块同级下创建文件xx.entity.ts文件。(当然这个你自己找位置也可以,或者给所有的entity模块都写到一个文件夹中也可以,只要能够在entities配置中找到相应的文件位置就可以,如果entities配置找不到相应的文件配置,框架就不能关联到相关的表,就会报错)
使用mysql2模块的好处就是对于表我们不需要提前创建好,只要配置好了entity文件,框架会为我们自动创建表,并且在启动的时候维护数据表结构。
文中只进行简单的数据表的配置,如果需要复杂的配置,需要去具体的去查看typeorm文档的实体文档。地址:https://typeorm.bootcss.com/entities
node.entity.ts

import { BaseEntity, Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

// name参数是使用的表名称
@Entity({ name: 'neimeng' })
export class Neimeng extends BaseEntity {
  // 自增主键
  @PrimaryGeneratedColumn({ type: 'int', name: 'id', comment: '链路的id' })
  id: number;
  // 列配置
  @Column({
    type: 'varchar',
    name: 'lianlu_code',
    comment: '链路的编号',
  })
  lianlu_code: string;
  @Column({
    type: 'varchar',
    name: 'lianlu_name',
    nullable: false,
    comment: '链路的名称',
  })
  lianlu_name: string;
  @Column('varchar', {
    name: 'lianlu_start',
    nullable: false,
    comment: '链路起始库',
  })
  lianlu_start: string;
  @Column({
    type: 'varchar',
    name: 'lianlu_end',
    nullable: false,
    comment: '链路的终止库',
  })
  lianlu_end: string;
  @Column({
    type: 'int',
    name: 'lianlu_status',
    default: 0,
    comment: '链路的状态',
  })
  lianlu_status: number;
}

node.module.ts
在module中注册实体

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { NodeController } from './node.controller';
import { Node } from './node.entity';
import { NodeService } from './node.service';

@Module({
  imports: [TypeOrmModule.forFeature([Node])],
  controllers: [NodeController],
  providers: [NodeService],
})
export class NodeModule {}

注册完之后就可以在service中使用了
node.service.ts
在service中有两种使用方式,一种是使用query builder 语法,一种是使用Repository
1·Repository

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { getConnection, Repository } from 'typeorm';
import { Node } from './node.entity';

@Injectable()
export class NodeService {
  // 获取总局节点信息
  async getNodeList() {
    const result = await getConnection()
      .createQueryBuilder()
      .select() // 这里添加参数会将每一个返回的字段的名称前面都添加一个"参数_"
      .from(Node, 'node') // 这里去别名施为了有查询条件的话可以使用node.xxx来进行字段条件判断
      .execute(); // 将获取的数据类型转换为json类型
    return result;
  }
}

关于更多查询条件等,可以查看typeorm文档find选项:https://typeorm.bootcss.com/find-options
2·Query Builder

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { getConnection, Repository } from 'typeorm';
import { createNodeDataDto } from './dto/node.dto';
import { Node } from './node.entity';
@Injectable()
export class NodeService {
  constructor(
    @InjectRepository(Node)
    private nodeZongjuRepository: Repository<Node>,
  ) {}
  async findAll() {
    let result = await this.nodeZongjuRepository
    .getRepository(User)
    .createQueryBuilder("user")
    .where("user.id = :id", { id: 1 })
    .getOne();
    return result;
  }
}

我们可以在find()之后使用链式调用的方式来实现。具体可以查看typeorm文档:https://typeorm.bootcss.com/select-query-builder
做完这些事情那么我们就可以在controller中调用service中的函数,从而执行数据库的相关操作了。

 类似资料: