Как мне сохранить массив объектов json с помощью typeorm в postgresql?

#typescript #postgresql #graphql #typeorm #typegraphql

#typescript #postgresql #graphql #typeorm #typegraphql

Вопрос:

У меня есть объект user, который предположительно содержит массив объектов json, но я не смог найти тип массива json для typeorm для хранения изначально, и я не уверен, как сохранить их в базе данных с помощью typeorm.

Текущая настройка работает с typegraphql, но меня смущает typeorm.

Моя пользовательская сущность примерно выглядит так:

User.ts

 import { Entity, PrimaryGeneratedColumn, Column, BaseEntity, ManyToOne } from "typeorm";
import { Field, Int, ObjectType, ID } from "type-graphql";


**//THIS ENTITY**
@ObjectType()
export class Softwares {
  @Field(() => Number)
  id: number;

  @Field()
  category: string;

  @Field(() => [String])
  list: string[];
}

@ObjectType()
export class About {
  @Field(  { nullable: true } )
  @Column("text", { nullable: true })
  about_header_message: string;

  **//THIS PART**
  @Field(() => [Softwares],  { nullable: true })
  softwares: Softwares[];

  @Field(() => [[String]],  { nullable: true })
  @Column("text", { nullable: true, array: true })
  info: string[][];
}

@ObjectType()
@Entity()
export class User extends BaseEntity {
  @Field(() => ID)
  @PrimaryGeneratedColumn()
  id: number;

  @Field({ nullable: true })
  @Column("text", { nullable: true })
  title_name: string;

  @Field({ nullable: true })
  @Column("text", { nullable: true })
  first_name: string;

  @Field({ nullable: true })
  @Column("text", { nullable: true })
  last_name: string;

  @Field((type) => About)
  @Column(() => About)
  about: About;
}
 

Обратите внимание, что класс About наследуется в обычную пользовательскую сущность. Я сделал это, потому что мой окончательный GraphQL в запросе get должен выглядеть примерно так :

 {
  title_name: "Sky Johnson",
  first_name: "Sky",
  last_name: "Johnson",
  about: {
    about_header_message: "A passionate developer, artist, and photographer",
    info: [
      ["University", "University of Colorado Boulder - Cumulative GPA: 3.376"],
      ["Graduation", "May Class of 2020"],
      ["Degree", "Computer Science (BS) - Degree GPA: 3.514"],
      ["2nd Degree", "Creative Technology and Design (BS) - Degree GPA: 3.657"],
      ["Minor", "Applied Mathematics: Theoretical Statistics"],
      ["Languages", "English: Native", "日本語:~N4 University Experience"],
    ],
    softwares: [
      {
        id: 1,
        category: "Favorite Languages",
        list: [
          "C#   Unity",
          "Python",
          "Java",
          "Scala",
          "Javascript/Typescript",
          "C/C   (limited)",
          "Processing/Arduino",
          "OpenSCAD",
        ],
      },
      {
        id: 2,
        category: "Python Libraries",
        list: [
          "Tensor Flow",
          "MatPlotLib",
          "NetworkX",
          "Seaborn",
          "SciKit",
          "Keras",
        ],
      },
    ],
  },
};
 

Я попытался использовать отношение ManyToOne в typeorm в поле softwares в типе about, но я не смог заставить его работать, так как я думаю, что унаследованный характер класса about для User портит его (поскольку у одного пользователя может быть много объектов software, но список программного обеспечения находится в aboutсущность).

Если у кого-нибудь есть какие-либо идеи, которые бы очень помогли. Спасибо!

Комментарии:

1. Я думаю, что я понял это, разделив программный объект на новый объект и вызвав для него много к одному с помощью «@ManyToOne ((type) => User, (user) => user.about.softwares)`

Ответ №1:

TypeORM и Postgres поддерживают jsonb field .

 @Column('jsonb')
tasks: Foo[];