nestjs配置MySQL数据库_Nestjs操作mysql数据库
_NestjstypeOrm
Nestjs数据库
Nest与数据库⽆关,允许您轻松地与任何SQL或NoSQL数据库集成。根据您的偏好,您有许多可⽤的选项。⼀般来说,将Nest连接到数据库只需为数据库加载⼀个适当的Node.js驱动程序,就像使⽤ Express 或Fastify⼀样。
您还可以直接使⽤任何通⽤的Node.js数据库集成库或ORM,例如 Sequelize (recipe)、knexjs (tutorial)`和 TypeORM ,以在更⾼的抽象级别上进⾏操作。
为了⽅便起见,Nest还提供了与现成的TypeORM与@nestjs/typeorm的紧密集成,我们将在本章中对此进⾏介绍,⽽与
@nestjs/mongoose的紧密集成将在本章中介绍。这些集成提供了附加的特定于nestjs的特性,⽐如模型/存储库注⼊、可测试性和异步配置,从⽽使访问您选择的数据库更加容易。
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。
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()相同的配置对象。另外,我们可以创建ormconfig.json,⽽不是将配置对象传递给forRoot()。
{
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "root",
"password": "root",
"database": "test",
"entities": ["dist/**/*.entity{.ts,.js}"],
"synchronize": true
}
> 静态全局路径(例如dist/**/*.entity{ .ts,.js})不适⽤于Webpack热重载。
然后,我们可以调⽤forRoot()没有任何选项:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
@Module({
imports: [TypeOrmModule.forRoot()],
})
export class AppModule {}
⼀旦完成,TypeORM连接和EntityManager对象就可以在整个项⽬中注⼊(不需要导⼊任何模块),例如:
import { Connection } from 'typeorm';
@Module({
imports: [TypeOrmModule.forRoot(), PhotoModule],
})
export class AppModule {
constructor(private readonly connection: Connection) {}
}
mysql下载app存储库模式
TypeORM⽀持存储库设计模式,因此每个实体都有⾃⼰的存储库。可以从数据库连接获得这些存储库。
为了继续这个⽰例,我们需要⾄少⼀个实体。我们将使⽤官⽅TypeORM⽂档中的Photo实体。
ity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Photo {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 500 })
name: string;
@Column('text')
description: string;
@Column()
filename: string;
@Column('int')
views: number;
@Column()
isPublished: boolean;
}
该Photo实体属于该photo⽬录。这个⽬录代表了PhotoModule。这是你决定在哪⾥保留你的模型⽂件。从我的观点来看,最好的⽅法是将它们放在他们的域中, 放在相应的模块⽬录中。
开始使⽤photo实体,我们需要让TypeORM知道它插⼊实体数组:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Photo } from './ity';
@Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'root',
database: 'test',
entities: [Photo],
synchronize: true,
}),
],
})
export class AppModule {}
现在让我们看⼀下PhotoModule:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { PhotoService } from './photo.service';
import { PhotoController } from './ller';
import { Photo } from './ity';
@Module({
imports: [TypeOrmModule.forFeature([Photo])],
providers: [PhotoService],
controllers: [PhotoController],
})
export class PhotoModule {}
此模块使⽤forFeature()⽅法定义在当前范围中注册哪些存储库。这样,我们就可以使⽤@InjectRepository()装饰器将PhotoRepository 注⼊到PhotoService中:
photo.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Photo } from './ity';
@Injectable()
export class PhotoService {
constructor(
@InjectRepository(Photo)
private readonly photoRepository: Repository,
) {}
findAll(): Promise {
return this.photoRepository.find();
}
}
> 不要忘记将PhotoModule导⼊根ApplicationModule。
如果要在导⼊TypeOrmModule.forFeature的模块之外使⽤存储库,则需要重新导出由其⽣成的提供程序。 您可以通过导出整个模块来做到这⼀点,如下所⽰:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Photo } from './ity';
@Module({
imports: [TypeOrmModule.forFeature([Photo])],
exports: [TypeOrmModule]
})
export class PhotoModule {}
现在,如果我们在PhotoHttpModule中导⼊PhotoModule,我们可以在后⼀个模块的提供者中使⽤@InjectRepository(Photo)。
import { Module } from '@nestjs/common';
import { PhotoModule } from './dule';
import { PhotoService } from './photo.service';
import { PhotoController } from './ller';
@Module({
imports: [PhotoModule],
providers: [PhotoService],
controllers: [PhotoController]
})
export class PhotoHttpModule {}
多个数据库
某些项⽬可能需要多个数据库连接。幸运的是,这也可以通过本模块实现。要使⽤多个连接,⾸先要做的是创建这些连接。在这种情况下,连接命名成为必填项。
假设你有⼀个Person实体和⼀个Album实体,每个实体都存储在他们⾃⼰的数据库中。
const defaultOptions = {
type: 'postgres',
port: 5432,
username: 'user',
password: 'password',
database: 'db',
synchronize: true,
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论