Nest.js Sequelize ORM到数据库(MySQL & PostgreSQL)示例

2025-03-25T14:41:46+08:00 | 8分钟阅读 | 更新于 2025-03-25T14:41:46+08:00

Macro Zhao

Nest.js Sequelize ORM到数据库(MySQL & PostgreSQL)示例

@TOC

推荐超级课程:

深入研究这个NestJS Sequelize教程,学习如何在NestJS中使用Sequelize创建一个示例数据库连接到PostgreSQL、MySQL和SQLite。

NestJS允许您使用Node.js和TypeScript创建开箱即用的应用程序架构。它与Sequelize模块集成得很好。这样,您可以在代码中创建模型,Sequelize ORM会处理使用SQL数据库(如MySQL和PostgreSQL)的数据库操作。

在本教程中,我将向您展示如何使用Sequelize ORM、MySQL和PostgreSQL构建NestJS。Sequelize作为ORM(对象关系映射)创建简单的代码结构,简化与SQLite、MySQL和PostgreSQL等关系数据库的交互。

您将学到什么

当我带领您深入了解Nest.js和Sequelize ORM如何合作时,您将构建一个RESTful API应用,并学习:

  • 如何利用Nest中的Sequelize模块对NestJS实体建模
  • 设置使用MySQL和Postgres数据库的Sequelize在NestJS中的最佳方式
  • 如何创建使用Sequelize的NestJS强大CRUD RESTful API。

先决条件

在跟随本教程时,请确保您具备以下条件:

  • 基本了解Nest.js的工作原理
  • 在计算机上安装了Node.js
  • 对于数据库,请确保您已准备好MySQL或PostgreSQL。

步骤1:创建您的第一个NestJS Sequelize ORM应用

在项目工作目录中,使用下面的命令创建一个开箱即用的Nest.js应用程序:

npm i -g @nestjs/cli
nest new nest-sequelize

跳转到您创建的新应用程序:

cd nest-sequelize

因为我们正在创建一个CRUD API:

  • 您需要一个用于您的API的模块。这将创建forFeature模块,作为Nest.js用于构建API Graph的起点。
  • 您需要一个用于监听Sequelize将使用的请求的控制器,并与您的数据库通信以执行CRUD操作。
  • 最后,一个提供程序可以在您的数据库中抽象出NestJS Sequelize ORM操作的复杂性和逻辑。

使用以下命令构建您的CRUD NestJS Graph:

nest g module products
nest g service products --no-spec
nest g controller products --no-spec

这将创建一个Product模块。这样,您可以将任何独特模块与其服务、控制器、实体和所有相关内容分组管理起来。

NestJS要求您安装Node.js 上的Sequelize模块 。这是Sequelize需要在Nest.js中舒适工作所需的软件包列表

安装以下Sequelize软件包:

npm i --save @nestjs/sequelize sequelize-typescript sequelize

与此同时,必须安装您选择的数据库的软件包。根据您的选择,可以是MySQL、SQLite或PostgreSQL:

npm i mysql2 pg sqlite

步骤2:使用NestJS与MySQL或PostgreSQL构建Sequelize模型

模型(或实体)是您的Sequelize蓝图。模型允许您定义具有相关属性的模块表。在此步骤中,您将使用代码描述数据库结构,而无需使用SQL查询。

以下是Sequelize如何在NestJS中执行此任务。现在,我们正在创建一个Product应用程序。因此,您需要诸如ID(用于任何关系型数据库)、产品名称、价格等属性。

转到您的src/products文件夹,并创建一个product.model.ts文件。您将使用Sequelize及其函数(如Table、Column和Model)创建如下实体:

import { Table, Column, Model } from 'sequelize-typescript';

@Table
export class Product extends Model<Product> {
  @Column
  name: string;

  @Column
  description: string;

  @Column
  price: number;
}

这将指示Sequelize创建一个名为Product的表。使用@Column添加每个属性及其数据类型。

您使用sequelize-typescript基于此示例定义这些属性。同时,您可以使用数据类型,Sequelize将为您建模属性。但是,您需要手动添加Sequelize TypeScript类型检查。

步骤3:使用NestJS与MySQL或PostgreSQL构建Sequelize ORM数据库连接

在Sequelize可以应用您的模型之前,必须建立数据库连接。首先,根据您具体的模块使用SequelizeModule加载您的模型。在这种情况下,转到src/products/product.module.ts文件,并确保forFeature可以获取您的Product实体,如下所示:

import { Module } from '@nestjs/common';
import { SequelizeModule } from '@nestjs/sequelize';
import { Product } from './product.model';
import { ProductsService } from './products.services';
import { ProductsController } from './products.controller';

@Module({
  imports: [SequelizeModule.forFeature([Product])],
  providers: [ProductsService],
  controllers: [ProductsController],
})
export class ProductsModule {}

NestJS现在将使用其主要模块作为构建API的入口点,使用app.module.ts。在此处,NestJS必须能够在一侧使用Sequelize ORM,而另一侧创建数据库连接并在数据库上建模表。

app.module.ts中,确保NestJS主要模块可以执行ProductsModuleSequelizeModule,如下所示:

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { SequelizeModule } from '@nestjs/sequelize';
import { ProductsModule } from './products/products.module';

@Module({
  imports: [
    SequelizeModule.forRoot({
      dialect: 'postgres',
      host: 'localhost',
      port: 5432,
      username: 'postgres',
      password: 'pass',
      database: 'store',
      autoLoadModels: true,
      synchronize: true,
    }),
    ProductsModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

注意:

  • 这将在PostgreSQL上创建一个数据库连接。dialect: 'postgres'明确告诉Sequelize您正在使用的数据库。
  • 必须添加数据库连接变量如上所示。
  • 需要注意的是,Sequelize不会异步创建数据库。因此,请确保您已创建数据库store

如果您使用的是MySQL,只需要更改dialect: 'mysql'并更改与MySQL相关的连接属性,如下所示:

      dialect: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'pass',
      database: 'store',
      autoLoadModels: true,
      synchronize: true,

步骤4:使用NestJS提供程序与Sequelize ORM

NestJS使用@Injectable()类来抽象应用程序的复杂逻辑。这样,您可以创建一个服务、存储库或工厂来管理您希望Sequelize在NestJS中执行的操作。

在此示例中,您有一个ProductsService。您将使用它来将所有与数据库的通信抽象为带有Sequelize的应用程序。转到您的src/products/products.services.ts文件,并将您的应用程序中需要的所有CRUD逻辑注入到存储库层,如下所示:

import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/sequelize';
import { Product } from './product.model';

@Injectable()
export class ProductsService {
  constructor(
    @InjectModel(Product)
    private readonly productModel: typeof Product,
  ) {}

  async create(productData): Promise<Product> {
    const product = new Product(productData);
    return await product.save();
  }

  async findAll(): Promise<Product[]> {
    return this.productModel.findAll();
  }

  async findOne(id: number): Promise<Product> {
    return this.productModel.findOne({ where: { id } });
  }

  async update(id: number, productData): Promise<[number, Product[]]> {
    const [affectedCount, affectedRows] = await this.productModel.update(productData, {
      where: { id },
      returning: true, 
    });
    return [affectedCount, affectedRows as Product[]];
  }

  async remove(id: number): Promise<number> {
    return this.productModel.destroy({ where: { id } });
  }
}

步骤5:使用NestJS控制器暴露Sequelize操作

@Controller()装饰器允许您添加路由作为参数以访问您的API。由于您有上述ProductsService,因此它将使您能够在处理像GET、POST、DELETE和PUT/PATCH这样的方法时,保持控制器简洁,以处理HTTP请求。

例如:

  • 您希望findAll()方法处理GET HTTP请求以获取所有产品。
  • ‘create’装饰器是您的ProductsService,应该允许您的控制器使用POST请求由Sequelize帮助将产品添加到数据库。

src/products/products.controller.ts中,按照以下方式处理GET、POST、DELETE、PUT/PATCH HTTP请求:

import { Controller, Get, Post, Put, Delete, Param, Body,Patch } from '@nestjs/common';
import { ProductsService } from './products.services';
import { Product } from './product.model';

@Controller('products')
export class ProductsController {
  constructor(private readonly productsService: ProductsService) {}

  @Post()
  create(@Body() productData): Promise<Product> {
    return this.productsService.create(productData);
  }

  @Get()
  findAll(): Promise<Product[]> {
    return this.productsService.findAll();
  }

  @Get(':id')
  findOne(@Param('id') id: string): Promise<Product> {
    return this.productsService.findOne(Number(id));
  }

  @Patch(':id') 
  update(@Param('id') id: string, @Body() productData): Promise<[number, Product[]]> {
    return this.productsService.update(Number(id), productData);
  }

  @Delete(':id')
  remove(@Param('id') id: string): Promise<number> {
    return this.productsService.remove(Number(id));
  }
}

步骤6:运行NestJS Sequelize应用程序

此时,您应该已准备好您的Sequelize NestJS应用程序。请继续运行您的应用程序,如下所示:

npm run start:dev

Sequelize将访问您的数据库并在PostgreSQL或MySQL上执行您的实体,而NestJS通过产品服务和控制器构建应用程序 Graph以创建API路由。

转到您的数据库并确认表及其属性是否已准备就绪。以下是PostgreSQL表的外观:

NestJS with Sequelize ORM Example, MySQL and PostgreSQL

步骤7:使用Postman测试NestJS CRUD

为了确保该应用程序正常运行,让我们使用相关的HTTP方法执行API端点。转到Postman,并发送POST请求至http://localhost:3000/products并按照以下方式创建您的第一个Sequelize NestJS Inspired应用程序:

NestJS with Sequelize ORM Example, MySQL and PostgreSQL

如果您发送GET请求至http://localhost:3000/products,您应该能够获取POST添加的内容:

NestJS with Sequelize ORM Example, MySQL and PostgreSQL

您所做的所有更改必须正确记录在您的数据库中。Sequelize和MySQL应该能够处理这一切:

NestJS with Sequelize ORM Example, MySQL and PostgreSQL

结论

这是一种用更有结构的方式构建您的NestJS服务器端应用程序与Sequelize和关系数据库(如MySQL和PostgreSQL)的教程。希望您找到本教程有用。 最后,您可以在这里 获得全部示例代码!

© 2011 - 2025 Macro Zhao的分享站

关于我

如遇到加载502错误,请尝试刷新😄

Hi,欢迎访问 Macro Zhao 的博客。Macro Zhao(或 Macro)是我在互联网上经常使用的名字。

我是一个热衷于技术探索和分享的IT工程师,在这里我会记录分享一些关于技术、工作和生活上的事情。

我的CSDN博客:
https://macro-zhao.blog.csdn.net/

欢迎你通过评论或者邮件与我交流。
Mail Me

推荐好玩(You'll Like)
  • AI 动·画
    • 这是一款有趣·免费的能让您画的画中的角色动起来的AI工具。
    • 支持几十种动作生成。
我的项目(My Projects)
  • 爱学习网

  • 小乙日语App

    • 这是一个帮助日语学习者学习日语的App。
      (当然初衷也是为了自用😄)
    • 界面干净,简洁,漂亮!
    • 其中包含 N1 + N2 的全部单词和语法。
    • 不需注册,更不需要订阅!完全免费!
  • 小乙日文阅读器

    • 词汇不够?照样能读日语名著!
    • 越读积累越多,积跬步致千里!
    • 哪里不会点哪里!妈妈再也不担心我读不了原版读物了!
赞助我(Sponsor Me)

如果你喜欢我的作品或者发现它们对你有所帮助,可以考虑给我买一杯咖啡 ☕️。这将激励我在未来创作和分享更多的项目和技术。🦾

👉 请我喝一杯咖啡

If you like my works or find them helpful, please consider buying me a cup of coffee ☕️. It inspires me to create and share more projects in the future. 🦾

👉 Buy me a coffee