Typescript TypeORM 创建和保存数据的最佳方式

Posted

技术标签:

【中文标题】Typescript TypeORM 创建和保存数据的最佳方式【英文标题】:Typescript TypeORM best way to create and save data 【发布时间】:2021-11-16 15:06:21 【问题描述】:

我目前正在开发一个 NestJS 项目,我必须将大量数据存储在单个数据库表中。所以我创建了一个实体、一个存储库、一个 dto 和路由来存储所有内容。我的 dto 就像我的实体一样,非常长,并且包含很多我必须存储的变量。几乎我的 dto 中的每个变量都是可选的,并且在实体中所有内容都是可以为空的,因此我必须在为其创建数据集之前验证该值是否存在。

我的实体:

import  Column, Entity, PrimaryGeneratedColumn  from 'typeorm';
import  distributionSponsors  from '../enums/distributionSponsors';
import  fbw  from '../enums/fbw';
import  MovieFskHf  from '../enums/movieFskHf';
import  MovieFskTr  from '../enums/movieFskTr';
import  MovieGenre  from '../enums/movieGenre';

@Entity()
export class Movie 
    @PrimaryGeneratedColumn()
    id: number;

    @Column( nullable: true )
    isPublished: boolean;

    @Column( nullable: true )
    cinemaRelease: Date;

    ...// more following the same format


import  ParseIntPipe  from '@nestjs/common';
import  ApiProperty  from '@nestjs/swagger';
import  Type  from 'class-transformer';
import  IsOptional, IsString  from 'class-validator';
import  distributionSponsors  from '../enums/distributionSponsors';
import  fbw  from '../enums/fbw';
import  MovieFskHf  from '../enums/movieFskHf';
import  MovieFskTr  from '../enums/movieFskTr';
import  MovieGenre  from '../enums/movieGenre';

export class CreateMovieDto 
    @ApiProperty()
    @IsOptional()
    isPublished: boolean;

    @ApiProperty()
    @IsOptional()
    cinemaRelease: Date;

    ... // more following the same format


现在在我的存储库中,我正在解构 dto。我不想将来自我的 dto 的每个变量都包装到一个 if 语句中。有没有更简单的方法来编写更紧凑的所有内容?

@EntityRepository(Movie)
export class MoviesRepository extends Repository<Movie> 
    async createMovie(
        createMovieDto: CreateMovieDto,
    ) 
        const movie = this.create();

        const 
            isPublished,
            cinemaRelease,
            title,
            orgTitle,
            ...//more following
         = createMovieDto;


       /* need logic here to do something like
       *  if(title)
       *  movie.title = title
       *  
       *  just for every single variable from the dto
       */

        try 
            await this.save(movie);
         catch (error) 
            //blah
        
    

【问题讨论】:

【参考方案1】:

您可以检查 DTO 对象并删除空属性:解决方案如下:

    async createMovie(
    createMovieDto: CreateMovieDto,
) 
    Object.keys(createMovieDto).forEach(
        k =>
        createMovieDto[k] == null ||
          (createMovieDto[k] == '' && delete createMovieDto[k]), 
      );

    try 
        await this.save(createMovieDto);
     catch (error) 
        //blah
    

【讨论】:

以上是关于Typescript TypeORM 创建和保存数据的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

如何删除多行 typeorm - postgresql 和 node.js(typescript)

Typescript & TypeORM:不能在模块外使用 import 语句

在 heroku 上部署 typeorm/typescript 应用程序

typescript 示例dinamic查询类似looporm与typeorm

如何在 TypeORM 中定义 varchar 和 enum?

同构应用程序,TypeORM && TypeScript && Express && Webpack 设置问题