nest js - Field 'columnName' doesn't have a default value

SP Yoon - Error Note·2022년 12월 20일
1

Error Note

목록 보기
5/6

QueryFailedError: Field 'userSeq' doesn't have a default value

  • 증상
    • ManyToOne으로 설정한 FK 컬럼에 컬럼값을 넣고 typeorm 모듈로 db에 저장하려고 할때 에러 발생
    • 에러문구 보면 FK 컬럼에 내가 설정한 컬럼값이 아닌 DEFAULT 값이 들어있음
    		// createSentenceDto= {sentence, translation, translator, userSeq}
    		//														  userSeq: FK 컬럼명
    		const response = await this.sentenceRepository.save(createSentenceDto);  // Error
  • 원인
    • typeorm모듈을 잘못된 문법으로 실행하여 발생한 문제
    • typeorm모듈은 FK로 설정한 컬럼은 컬럼값이 아닌 해당 객체를 넣어주어야하는데 컬럼값을 넣어서 발생한 문제
  • 해결

    • FK 컬럼의 값으로 객체를 불러와 넣어주자
      const user = await this.usersService.findOne(createSentenceDto.userSeq);
    
      if (!user) {
        throw new Error('user not found');
      }
    
      const sentence = new Sentence();
      sentence.col1 = value1;
      sentence.user = user;
    	
      const response = await this.sentenceRepository.save(sentence);  
  • 참고

    • ManyToOne으로 설정한 필드 값 넣기

      // 엔티티 객체정보
      export class Photo {
        @ManyToOne(() => User, (user) => user.photos)
        user: User
      }
      
      export class User {
        @OneToMany(() => Photo, (photo) => photo.user)
        photos: Photo[] 
      } 
      
      
      // 1. 첫번째 방법: 참조하는 테이블(photo)의 데이터부터 저장한 후 참조대상테이블(user) 저장
      const photo1 = new Photo()
      photo1.url = "me.jpg"
      await dataSource.manager.save(photo1)
      
      const photo2 = new Photo()
      photo2.url = "me-and-bears.jpg"
      await dataSource.manager.save(photo2)
      
      const user = new User()
      user.name = "John"
      user.photos = [photo1, photo2]
      await dataSource.manager.save(user)
      
      // 2. 두번째 방법: 참조 대상(user) 테이블부터 저장한 후 참조하는 테이블(photo) 저장
      const user = new User()
      user.name = "Leo"
      await dataSource.manager.save(user)
      
      const photo1 = new Photo()
      photo1.url = "me.jpg"
      photo1.user = user
      await dataSource.manager.save(photo1)
      
      const photo2 = new Photo()
      photo2.url = "me-and-bears.jpg"
      photo2.user = user
      await dataSource.manager.save(photo2)
      

간단한 에러지만 원인을 찾는데 은근히 시간이 걸렸습니다.
부디 저와 같은 일을 겪지 않으셨으면 합니다.

1개의 댓글

comment-user-thumbnail
2024년 1월 3일

잘보고 갑니당~

답글 달기