Búsqueda de sitios web

node.js - QueryFailedError: la columna "price" contiene valores nulos - TypeORM - PostgreSQL


He creado una tabla simple:

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
}

Genero la migración y también la ejecuto. Cuando no tengo datos en la base de datos y ejecuto el servidor, tiene éxito. Pero cuando agrego 1 fila en la base de datos y lo ejecuto de nuevo, aparece el siguiente error:

QueryFailedError: the column «price» contain null values

La base de datos definitivamente tiene la fila con todos los datos. Probé muchos casos y ninguno de ellos fue correcto.

¿Alguien tiene alguna idea para esto?

Respuesta #1

Tuve un problema similar y lo informé al final de este hilo.

Probablemente tienes synchronize: true en la configuración de tu ORM. Debido a esto, cada vez que ejecutas tu aplicación, Typeorm intenta crear las tablas. Si tienes datos en tu base de datos, lanza ese error engañoso.

De aquí:

sincronizar - Indica si el esquema de la base de datos debe crearse automáticamente en cada inicio de la aplicación. Ten cuidado con esta opción y no la uses en producción, de lo contrario podrías perder datos de producción. Esta opción es útil durante la depuración y el desarrollo. Como alternativa, puedes usar la CLI y ejecutar el comando schema:sync. Ten en cuenta que para bases de datos MongoDB no se crea el esquema, porque MongoDB no tiene esquema. En su lugar, se sincroniza creando únicamente índices.

Respuesta #2

El Problema

Esta línea de código aquí es la problematica:

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

Has establecido nullable: false, lo que significa que nunca quieres que esta columna sea nula.

¿Por qué te está causando problemas esto?

Porque ya tienes filas en tu base de datos que no tienen una entrada para esta columna.

Recuerda:

Antes de esta migración, la columna no existía. Pero ahora estás ejecutando una migración para agregar una nueva columna.

Pero TypeORM necesita una manera de manejar las filas existentes...

Entonces, si fueras TypeORM, ¿qué valor asignarías por defecto si la columna no existiera? Probablemente NULL. Lo cual es exactamente lo que hace. Y por eso surge el error.

¿Cómo solucionas este problema?

Hay dos caminos aquí.

Manera muy fácil

Establecer un valor predeterminado en ColumnOptions

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

PELIGRO: La opción nuclear

Elimina todos los datos de la tabla, luego ejecuta la migración de nuevo.

En Postgres PSQL:

DELETE FROM test;

Artículos relacionados