You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nestjs不使用ORM实现MySQL连接及表初始化的方法咨询

原生 MySQL 在 NestJS + TypeScript 中的实现方案(无ORM)

1. 安装必要依赖

优先使用mysql2包,比原生mysql包性能更好、原生支持Promise、自带TypeScript类型适配:

npm install mysql2 --save
# 可选,缺少类型提示时安装
npm install @types/mysql2 --save-dev

2. 创建MySQL连接&初始化文件

新建src/mysql.provider.ts,完全对应你原Express代码的功能,同时修正了原SQL的语法错误(varchar补长度、加IF NOT EXISTS避免重复创建报错):

import * as mysql from 'mysql2/promise';
import { Provider } from '@nestjs/common';

// 注入标识,后续用来获取连接实例
export const MYSQL_CONNECTION = 'MYSQL_CONNECTION';

export const MysqlProvider: Provider = {
  provide: MYSQL_CONNECTION,
  useFactory: async () => {
    // 初始不指定database,先创建目标库
    const connection = await mysql.createConnection({
      host: 'localhost',
      user: 'user',
      password: 'password',
    });

    // 初始化SQL,和你原代码逻辑一致
    const initSql = `
      CREATE DATABASE IF NOT EXISTS employees;
      USE employees;
      CREATE TABLE IF NOT EXISTS users (
        username varchar(255) NOT NULL,
        email varchar(255) NOT NULL,
        password varchar(255) NOT NULL,
        createdAt datetime DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (email)
      );
    `;

    try {
      await connection.query(initSql);
      console.log('CREATED SUCCESSFULLY');
    } catch (err) {
      console.error('库表初始化失败:', err);
    }

    return connection;
  },
};

3. 全局注册提供者

新建src/mysql.module.ts,全局注册后所有业务模块都可以直接注入连接实例:

import { Module, Global } from '@nestjs/common';
import { MysqlProvider } from './mysql.provider';

@Global()
@Module({
  providers: [MysqlProvider],
  exports: [MysqlProvider],
})
export class MysqlModule {}

之后把MysqlModule添加到AppModule的imports数组中即可。

4. 业务中使用示例

需要操作数据库的地方直接注入连接实例即可,用法和原生query完全一致:

import { Injectable, Inject } from '@nestjs/common';
import { MYSQL_CONNECTION } from './mysql.provider';
import { Connection } from 'mysql2/promise';

@Injectable()
export class UserService {
  constructor(@Inject(MYSQL_CONNECTION) private readonly db: Connection) {}

  async getAllUsers() {
    // 返回结果第一个元素是查询结果集
    const [rows] = await this.db.query('SELECT * FROM users');
    return rows;
  }
}

额外优化提示

  • 生产环境推荐用createPool创建连接池代替单连接,性能更高,用法和单连接完全一致
  • 数据库配置不要硬编码,推荐配合@nestjs/config从环境变量读取
  • 所有query操作都是异步的,必须配合async/await使用

内容的提问来源于stack exchange,提问作者Pipi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:45:10