여러 필드가 있는 TypeORM 고유 인덱스

최근에 데이터베이스 테이블의 특정 필드를 기반으로 중복 레코드가 있는 위치에서 오류를 발생시키는 데이터베이스 고유 규칙을 생성하려는 문제에 직면했습니다.

복잡성은 이러한 필드 중 하나가 다른 테이블에 대한 관계이고 이를 구현하는 방법을 잘 모르겠습니다.

컨텍스트를 좀 더 제공하기 위해 다음 예제를 살펴보겠습니다.

학생으로 구성된 학교 수업이 있고 수업에 같은 이름을 가진 두 명의 학생이 있는 상황을 피하고 싶다고 가정해 보겠습니다(두 학생이 테이블에 나타날 수 있지만 다른 수업에 있는 경우에만).

Class (1) => Student (N)


암호



일반적으로 테이블에서 고유성을 달성하려면 UNIQUE 키워드를 사용하여 TypeORM(및 일반 SQL에서도)에서 고유성을 달성할 수 있습니다. TypeORM에서 우리는 @Unique(param) 데코레이터를 사용하고 고유하게 만들고 싶은 필드의 이름을 매개변수로 전달합니다(예: @Unique('name') ).

그러나 우리의 경우에는 다른 SQL 키워드와 TypeORM 데코레이터를 사용해야 합니다.

학생 엔터티를 살펴보겠습니다.

import {
  Entity,
  Column,
  PrimaryGeneratedColumn,
  ManyToOne,
} from 'typeorm';
import { SchoolClass } from '../school-class.entity';

@Entity()
export class StudentEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @ManyToOne(() => SchoolClass, (schoolClass) => schoolClass.students)
  schoolClass: SchoolClass;

  @Column()
  name: string;
}


테이블에는 세 개의 열이 있습니다.
  • id 특정 레코드의 고유 ID입니다.

  • 클래스 테이블
  • 과의 ManyToOne 관계인 schoolClass
  • name 학생의 이름입니다.

  • 학교 수업에서 고유한 이름으로 문제를 해결하기 위해 @Index 데코레이터를 사용합니다(그런 다음 SQL에서 INDEX로 변환됨).

    import {
      Entity,
      Column,
      PrimaryGeneratedColumn,
      ManyToOne,
      Index,
    } from 'typeorm';
    import { SchoolClass } from '../school-class.entity';
    
    @Entity()
    @Index(['name', 'schoolClass'], { unique: true }) // Here
    export class StudentEntity {
      @PrimaryGeneratedColumn()
      id: number;
    
      @ManyToOne(() => SchoolClass, (schoolClass) => schoolClass.students)
      schoolClass: SchoolClass;
    
      @Column()
      name: string;
    }
    


    사용하려는 값을 배열로 전달합니다(이 경우 nameschoolClass ). 또한 unique 속성이 true 로 설정된 옵션 개체를 전달하고 있습니다. 이렇게 하면 학교 수업에서 같은 이름으로 데이터베이스에 새 레코드를 삽입하면 DUPLICATE_ENTRY 오류가 발생합니다.

    요약



    잘 했어! 새 데이터를 데이터베이스에 삽입하기 위한 고유한 규칙을 만드는 방법을 배웠습니다. 최근에 겪었던 유사한 문제를 해결하는 데 도움이 되기를 바랍니다. :)

    좋은 웹페이지 즐겨찾기