UFO ET IT

QueryFailedError: "price" 열에 Null 값(TypeORM - Postgre)이 포함되어 있습니다.SQL

ufoet 2023. 6. 22. 23:14
반응형

QueryFailedError: "price" 열에 Null 값(TypeORM - Postgre)이 포함되어 있습니다.SQL

간단한 표를 만들었습니다.

import { Column, Entity, PrimaryGeneratedColumn } from "typeorm"

@Entity()
export class Test {
    @PrimaryGeneratedColumn()
    public id!: number

    @Column({ nullable: false })
    public name!: string

    @Column({ nullable: false, type: "float" })
    public price!: number
}

마이그레이션을 생성하고 실행합니다.데이터베이스에 데이터가 없고 서버를 실행하면 성공합니다.그러나 데이터베이스에 행을 하나 추가하고 다시 실행하면 다음 오류가 나타납니다.

QueryFailedError: the column «price» contain null values

데이터베이스에는 모든 데이터가 포함된 행이 있습니다.저는 많은 경우를 시도했지만 어느 것도 정확하지 않았습니다.

누가 그것에 대해 생각나는 사람?

저도 비슷한 문제가 있었는데, 이 스레드 하단에 보고했습니다.

아마당을 가지고 있을 입니다.synchronize: true사용자의 ORM 구성에 있습니다.이 때문에 앱을 실행할 때마다 Typeor가 테이블을 생성하려고 합니다.DB에 데이터가 있으면 잘못된 오류가 발생합니다.

여기서:

동기화 - 응용프로그램을 시작할 때마다 데이터베이스 스키마를 자동으로 만들어야 하는지 여부를 나타냅니다.이 옵션을 사용할 때는 주의해야 하며 프로덕션에서 사용하지 마십시오. 그렇지 않으면 프로덕션 데이터가 손실될 수 있습니다.이 옵션은 디버그 및 개발 중에 유용합니다.대신 CLI를 사용하여 schema:sync 명령을 실행할 수 있습니다.MongoDB 데이터베이스의 경우 MongoDB는 스키마가 없으므로 스키마를 만들지 않습니다.대신 인덱스를 만드는 것만으로 동기화됩니다.

문제

바로 여기 코드 줄이 문제를 일으키는 사람입니다.

@Column({ nullable: false, type: "float" })
public price!: number

은 설니습다로 설정했습니다.nullable: false, 이 null.", "null" 및 "null"로 하지 않습니다.

이것이 왜 당신을 곤란하게 합니까?

데이터베이스에 이 열에 대한 항목이 없는 행이 이미 있기 때문입니다.

기억:

이 마이그레이션 이전에는 열이 없었습니다.그러나 이제 새 열을 추가하기 위해 마이그레이션을 실행하고 있습니다.

하지만 TypeORM은 기존 행을 처리할 수 있는 방법이 필요합니다.

그렇다면, 당신이 TypeORM이라면, 만약 열이 존재하지 않는다면 기본적으로 어떤 값을 할당할 것입니까? ㅠㅠNULL그게 바로 그것이 하는 일입니다.그래서 오류가 발생한 것입니다.

이 문제를 어떻게 해결합니까?

여기에는 두 가지 방법이 있습니다.

아주 쉬운 방법

설다니합에 합니다.ColumnOptions

@Column({ nullable: false, type: "float", default: 0.0 })
public price!: number

위험: 핵 옵션

테이블에서 모든 데이터를 삭제한 다음 마이그레이션을 다시 실행합니다.

Postgres PSQL에서:

DELETE FROM test;

"synchronize": false in formconfig.json이 이 문제를 해결합니다.

{
   ....
   "synchronize": false,
   ....
}

난 이 실체를 가졌어요.

import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";

@Entity()
export class User {

@PrimaryGeneratedColumn()
id!: number;

@Column('text')
firstName!: string;

}

"column "firstName"에 null 값이 포함됩니다." 오류가 발생했습니다.그래서 여기 https://github.com/typeorm/typeorm/issues/845 에서 @pleerrok가 제안한 것처럼 {precable:true}를 추가했고 효과가 있었습니다.

import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";

@Entity()
export class User {

@PrimaryGeneratedColumn()
id!: number;

@Column('text', {nullable: true})
firstName: string;

}

저도 같은 문제가 있었습니다.기본값을 설정할 수 있습니다.nullable: true전에 말한 바와 같이또한, 제가 도움이 된 것은 삭제한 것입니다..dist새 변경사항을 사용하여 빌드에서 재생성하려면 폴더를 선택합니다.

만약 당신이 그것을 삭제한다면?nullable선언 또는 만약 당신이 그것을 설정한다면?true...

그러면 당신은 할 수 있습니다.nullable클래스 관리자의 유효성 검사 장식자를 사용하여 확인합니다.

저도 같은 문제가 있었습니다.기본값이 없는 새 열을 추가할 때 열의 기본값은 다음과 같습니다.null그리고 typeorm은 당신이 명시적으로 괜찮다는 것을 지정하지 않으면 그것을 허용하지 않을 것입니다.null

나에게 그것은 내가 추가한 후에 작동했습니다.@Column({nullable: true})이것은 타입이나 타입이 괜찮다는 것을 말해줍니다.null종렬로

또는 @nathanl93에서 제안한 것처럼 기본값을 지정할 수 있습니다.@Column({default: 'aDefaultValue'})다른 값을 지정하지 않을 경우에는 매번 지정된 기본값으로 새 열이 추가됩니다.

매개 변수가 있는지 확인해야 합니다."syncronize": trueDB에 대한 연결을 구성했습니다.나에게 그것은 그것이었습니다.ormconfig.json파일.

이 문제는 열에 null 값이 없는 경우에도 열 유형을 변경할 때 발생합니다.

아이러니하게도 저는 "가격"이라는 표에서 "통화"라는 칼럼을 접하게 되었고, 그래서 당신의 질문은 섬뜩할 정도로 가까웠습니다.데이터베이스를 확인한 결과 모든 값이 'USD'(현재는 하나의 통화만 지원하는 새로운 앱)인 것으로 확인되었습니다.

달라진 것은 장식가를 바꿨다는 것입니다.@Column()로.@Column('text')그래서 뒤뚱뒤뚱 찾아다니는 다른 사람들을 위해, 추가.{default:"USD"}저를 위해 일했습니다.

가는 것보다 더 좋았습니다.{nullable:true}난 절대로 그 열을 비워두지 않기 때문입니다.

더 이상한 것은 동기화를 한 번 실행한 후 선언을 제거할 수 있었다는 것입니다.다시 한 번 말하지만, 나는 null 행이 전혀 없다는 것을 확인했습니다.

언급URL : https://stackoverflow.com/questions/52064130/queryfailederror-the-column-price-contain-null-values-typeorm-postgresql

반응형