typeorm 表名_SQL(TypeORM)

SQL(TypeORM)

本章仅适用于TypeScript

警告在本文中,您将学习如何使用自定义提供程序机制从头开始创建DatabaseModule基于TypeORM包。因此,此解决方案包含大量开销,您可以使用现成的和可用的开箱即用专用@nestjs/typeorm软件包来省略。

TypeORM 绝对是node.js世界中最成熟的对象关系映射器(ORM)。由于它是用TypeScript编写的,因此它与Nest框架非常兼容。要使用此库启动冒险,我们必须安装所有必需的依赖项:

$ npm install --save typeorm mysql

我们需要做的第一步是使用createConnection()从typeorm包导入的函数与我们的数据库建立连接。该createConnection()函数返回a Promise,因此我们必须创建一个异步提供程序。

database.providers.ts

import { createConnection } from 'typeorm';

export const databaseProviders = [

{

provide: 'DbConnectionToken',

useFactory: async () => await createConnection({

type: 'mysql',

host: 'localhost',

port: 3306,

username: 'root',

password: 'root',

database: 'test',

entities: [

__dirname + '/../**/*.entity{.ts,.js}',

],

synchronize: true,

}),

},

];

提示遵循最佳实践,我们在具有*.providers.ts后缀的分隔文件中声明了自定义提供程序。

然后,我们需要导出这些提供程序,以使其可供应用程序的其余部分访问。

database.module.ts

import { Module } from '@nestjs/common';

import { databaseProviders } from './database.providers';

@Module({

providers: [...databaseProviders],

exports: [...databaseProviders],

})

export class DatabaseModule {}

现在我们可以Connection使用@Inject()装饰器注入对象。依赖于Connection异步提供程序的每个类都将等到a Promise被解析。

存储库模式

该 TypeORM 支持库的设计模式,因此每个实体都有自己的仓库。可以从数据库连接获取这些存储库。

但首先,我们至少需要一个实体。我们Photo将从官方文档中重用该实体。

照片/ photo.entity.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。现在,让我们创建一个Repository提供者:

photo.providers.ts

import { Connection, Repository } from 'typeorm';

import { Photo } from './photo.entity';

export const photoProviders = [

{

provide: 'PhotoRepositoryToken',

useFactory: (connection: Connection) => connection.getRepository(Photo),

inject: ['DbConnectionToken'],

},

];

注意在实际应用程序中,您应该避免使用魔术字符串。双方PhotoRepositoryToken并DbConnectionToken应保持在分开的constants.ts文件。

现在,我们可以注入PhotoRepository的到PhotoService用的@Inject()装饰:

photo.service.ts

import { Injectable, Inject } from '@nestjs/common';

import { Repository } from 'typeorm';

import { Photo } from './photo.entity';

@Injectable()

export class PhotoService {

constructor(

@Inject('PhotoRepositoryToken')

private readonly photoRepository: Repository,

) {}

async findAll(): Promise {

return await this.photoRepository.find();

}

}

数据库连接是异步的,但是Nest使这个过程对最终用户完全不可见。在PhotoRepository等待数据库连接,并且PhotoService被延迟,直到库已准备好使用。整个应用程序可以在每个类实例化时启动。

这是一个决赛PhotoModule:

photo.module.ts

import { Module } from '@nestjs/common';

import { DatabaseModule } from '../database/database.module';

import { photoProviders } from './photo.providers';

import { PhotoService } from './photo.service';

@Module({

imports: [DatabaseModule],

providers: [

...photoProviders,

PhotoService,

],

})

export class PhotoModule {}

提示不要忘记将其导入PhotoModule根目录ApplicationModule。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值