数据库

Nest 与数据库无关,允许您轻松地与任何 SQL 或 NoSQL 数据库集成.根据您的偏好,您有许多可用的选项.一般来说,将 Nest 连接到数据库只需为数据库加载一个适当的 Node.js 驱动程序,就像使用 Express 或 Fastify 一样.

您还可以直接使用任何通用的 Node.js 数据库集成库或 ORM ,以在更高的抽象级别上进行操作.

  • Sequelize (recipe)
  • knexjs (tutorial
  • TypeORM

Nest 还提供了与现成的 TypeORM 与 @nestjs/typeorm 的紧密集成.这些集成提供了附加的特定于 nestjs 的特性,比如模型/存储库注入、可测试性和异步配置,从而使访问您选择的数据库更加容易

TypeORM 集成

为了与 SQL 和 NoSQL 数据库集成,Nest 提供了 @nestjs/typeorm 包.Nest 使用 TypeORM 是因为它是 TypeScript 中最成熟的对象关系映射器( ORM ).因为它是用 TypeScript 编写的,所以可以很好地与 Nest 框架集成.

为了开始使用它,我们首先安装所需的依赖项.在本章中,我们将演示如何使用流行的 Mysql , TypeORM 提供了对许多关系数据库的支持,比如 PostgreSQL 、Oracle、Microsoft SQL Server、SQLite,甚至像 MongoDB 这样的 NoSQL 数据库.我们在本章中介绍的过程对于 TypeORM 支持的任何数据库都是相同的.您只需为所选数据库安装相关的客户端 API 库.

npm install --save @nestjs/typeorm typeorm mysql

安装过程完成后,我们可以将 TypeOrmModule 导入 AppModule

方法一

app.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm'; @Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'root',
database: 'test',
entities: [],
synchronize: true,
}),
],
})
export class AppModule {}

forRoot() 方法接受与来自 TypeORM 包的 createConnection() 相同的配置对象

方法二

app.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm'; @Module({
imports: [TypeOrmModule.forRoot()],
})
export class AppModule {}

创建 ormconfig.json,可以将 forRoot()配置抽离出来,不传入没有任何选项调用 forRoot()

{
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "root",
"password": "root",
"database": "test",
"entities": ["dist/**/*.entity{.ts,.js}"],
"synchronize": true
}

一旦完成,TypeORM 连接和 EntityManager 对象就可以在整个项目中注入(不需要导入任何模块)

app.module.ts

import { Connection } from 'typeorm';

@Module({
imports: [TypeOrmModule.forRoot(), ImageModule],
})
export class AppModule {
constructor(private readonly connection: Connection) {}
}

存储库模式

TypeORM 支持存储库设计模式,因此每个实体都有自己的存储库.可以从数据库连接获得这些存储库.该 image 实体属于该 image 目录.这个目录代表了 ImageModule.这是你决定在哪里保留你的模型文件.最好的方法是将它们放在他们的域中, 放在相应的模块目录中.

./src/image/entity/image.entity.ts

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

@Entity()
export class Image {
@PrimaryGeneratedColumn()
public id: number; @Column({ length: 50 })
public name: string; @Column({ length: 300 })
public path: string; @Column({ length: 50 })
public createdBy: string; @Column('int')
public createAt: number;
}

开始使用 image 实体,我们需要让 TypeORM 知道它插入实体数组:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Image } from './image/entity/image.entity'; @Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'root',
database: 'test',
entities: [Image],
synchronize: true,
}),
],
})
export class AppModule {}

同时修改 image.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ImageService } from './Image.service';
import { ImageController } from './Image.controller';
import { Image } from './Image.entity'; @Module({
imports: [TypeOrmModule.forFeature([Image])],
providers: [ImageService],
controllers: [ImageController],
})
export class ImageModule {}

此模块使用 forFeature() 方法定义在当前范围中注册哪些存储库.这样,我们就可以使用 @InjectRepository()装饰器将 ImageRepository 注入到 ImageService 中:

之后再 service 中进行使用

image.service.ts

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Image } from './Image.entity'; @Injectable()
export class ImageService {
constructor(
@InjectRepository(Image)
private readonly ImageRepository: Repository<Image>,
) {} findAll(): Promise<Image[]> {
return this.ImageRepository.find();
}
}

不要忘记将 ImageModule 导入根 ApplicationModule.

如果要在导入 TypeOrmModule.forFeature 的模块之外使用存储库,则需要重新导出由其生成的提供程序.您可以通过导出整个模块来做到这一点,

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Image } from './Image.entity'; @Module({
imports: [TypeOrmModule.forFeature([Image])],
exports: [TypeOrmModule]
})
export class ImageModule {}

现在,如果我们在 ImageHttpModule 中导入 ImageModule ,我们可以在后一个模块的提供者中使用 @InjectRepository(Image).

Image-http.module.ts

import { Module } from '@nestjs/common';
import { ImageModule } from './Image.module';
import { ImageService } from './Image.service';
import { ImageController } from './Image.controller'; @Module({
imports: [ImageModule],
providers: [ImageService],
controllers: [ImageController]
})
export class ImageHttpModule {}

配置自动加载 entity

./ormconfig.json

{
"type": "mysql",
"host": "127.0.0.1",
"port": 3306,
"username": "xxxxx",
"password": "xxxxx",
"database": "ks",
"entities": ["src/**/*.entity{.ts,.js}"],
"synchronize": true
}

[Nest] 05.nest之数据库的更多相关文章

  1. [Nest] 03.nest之提供者 provider

    提供者 provider 提供程序是 Nest 的一个基本概念.许多基本的 Nest 类可能被视为提供者 - service,repository, factory, helper 等等. 他们都可以 ...

  2. [Nest] 02.nest之控制器

    控制器 Controller Nest 的核心概念 模块 Module 控制器 Controller 服务与依赖注入 Provider Dependency injection 控制器负责处理应用的特 ...

  3. 【SSH网上商城项目实战05】完成数据库的级联查询和分页

    转自:https://blog.csdn.net/eson_15/article/details/51320212 上一节我们完成了EasyUI菜单的实现.这一节我们主要来写一下CategorySer ...

  4. [Nest] 01.初见nest.js

    github nest 介绍 Nest 是一个用于构建高效,可扩展的 Node.js 服务器端应用程序的框架.它使用渐进式 JavaScript,内置并完全支持 TypeScript(但仍然允许开发人 ...

  5. nest

    d3.nest d3.nest表示一种嵌套结构.之所以成为嵌套是因为可以指定多个key访问器,这些访问器是一层一层嵌套的. 作用 将数组中的元素对象,按照key方法指定的属性,分组为层次结构.与SQL ...

  6. sql server异地备份数据库

    --注意:异地备份数据库,需要先开启备份文件夹的网络共享,数据库选择master --打开允许执行xp_cmdshell exec master..xp_cmdshell 'net use \\192 ...

  7. Amoeba For MySQL入门:实现数据库水平切分

    当系统数据量发展到一定程度后,往往需要进行数据库的垂直切分和水平切分,以实现负载均衡和性能提升,而数据切分后随之会带来多数据源整合等等问题.如果仅仅从应用程序的角度去解决这类问题,无疑会加重应用程度的 ...

  8. MySql cmd下的学习笔记 —— 有关建立数据库的操作(连接Mysql,建立数据库,删除数据库等等)

    (01) 连接数据库 mysql -uroot -p 之后输入密码 ******.(由于我的密码设置的是111,所以输入的是111) (02) 退出数据库 exit (03) 查看数据库 show d ...

  9. 学会4种备份MySQL数据库(基本备份方面没问题了)

    前言 我们试着想一想, 在生产环境中什么最重要?如果我们服务器的硬件坏了可以维修或者换新, 软件问题可以修复或重新安装, 但是如果数据没了呢?这可能是最恐怖的事情了吧, 我感觉在生产环境中应该没有什么 ...

随机推荐

  1. [题解] [ZJOI2014] 力

    题面 题解 恩, 我们首先有这两个关系 \[ \displaystyle\begin{aligned} F_j &= \sum_{i < j}\frac{q_iq_j}{(i - j)^ ...

  2. win10无法连接windows服务器,无法连接SENS服务

    本文链接:https://blog.csdn.net/weixin_38374974/article/details/80475566 膜拜大佬 首先,进入windows界面的时候,前期加载速度变得极 ...

  3. Android——NativeActivity - C/C++ Apk开发

    android基本的四大组件之一Activity,android开发的第一个hello world 创建的就是这个继承了Activity类的类,拥有对应的生命周期,由AMS维护,只需要重写父类对应的方 ...

  4. 堆排序 java

    <pre name="code" class="java">package heapSort; /** * 大根堆 * @author root * ...

  5. springboot ---> spring ioc 注册流程 源码解析 this.prepareContext 部分

    现在都是在springboot 中 集成 spirng,那我们就从springboot 开始. 一:springboot 启动main 函数 public static void main(Strin ...

  6. jsp页面中使用javabean

    <%@ page language="java" import="java.util.*,com.loaderman.demo.b_cases.*" pa ...

  7. Hibernate查询总的记录数

    1. 原生sql String hql="select count(*) from product" ;//此处的product是数据库中的表名 Query query=sessi ...

  8. 使用Navicat Premium 客户端绕过白名单限制mysql数据库

    针对有些数据库有白名单限制,但如果IP经常浮动的话,会要经常加白名单,但如果知道可以连接数据库的linux用户密码就能 通过SSH通道代理来连接数据库.保存密码后,这样就能直接连接数据库,减省很多麻烦 ...

  9. Java模拟实现百度文档在线浏览

    Java模拟实现百度文档在线浏览 这个思路是我参考网上而来,代码是我实现. 采用Apache下面的OpenOffice将资源文件转化为pdf文件,然后将pdf文件转化为swf文件,用FlexPaper ...

  10. springboot中静态属性/静态方法从YAML(yml)读取配置属性

    启动类添加注解@EnableConfigurationProperties import jnetman.session.SnmpPref; import org.springframework.bo ...