QueryFailedError: столбец «цена» содержит нулевые значения - TYPEORM - POSTGRESQL - PullRequest
0 голосов
/ 28 августа 2018

Я создал простую таблицу:

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

}

Я создаю миграцию и запускаю ее также. Когда у меня нет данных в базе данных, и я запускаю сервер, это успешно. Но когда я добавляю 1 строку в базу данных и запускаю ее снова, появляется следующая ошибка:

QueryFailedError: the column «price» contain null values

В базе данных определенно есть строка со всеми данными. Я перепробовал много случаев, и ни один из них не был правильным.

Кто-нибудь есть идея для этого?

Ответы [ 5 ]

0 голосов
/ 31 мая 2019

Set "synchronize": false in ormconfig.json исправит эту проблему:

{
   ....
   "synchronize": false,
   ....
}
0 голосов
/ 05 мая 2019

Проблема

Эта строка кода прямо здесь - нарушитель спокойствия:

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

Вы установили nullable: false, что означает, что вы никогда не хотите, чтобы этот столбец был нулевым.

Почему это доставляет вам неприятности?

Поскольку в вашей базе данных уже есть строки, в которых нет записи для этого столбца.

Помните:

До этой миграции столбец не существовал. Но теперь вы запускаете миграцию, чтобы добавить новый столбец.

Но TypeORM нужен способ обработки существующих строк ...

Итак, если бы вы были TypeORM, какое значение вы бы присвоили по умолчанию, если бы столбец не существовал? Вероятно NULL. Что именно и делает. И вот почему ошибка.

Как вы решаете эту проблему?

Здесь есть два пути.

Очень простой способ

Установить значение по умолчанию в ColumnOptions

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

ОПАСНОСТЬ: ядерный вариант

Удалите все данные из таблицы, затем повторно запустите миграцию.

В Postgres PSQL:

DELETE FROM test;
0 голосов
/ 16 октября 2018

У меня была похожая проблема, и я сообщил об этом внизу этой темы .

Возможно, в вашей конфигурации ORM synchronize: true. По этой причине каждый раз, когда вы запускаете ваше приложение, Typeorm пытается создать таблицы и, если у вас есть данные, выдает эту вводящую в заблуждение ошибку.

С здесь :

синхронизация - указывает, должна ли схема базы данных автоматически создаваться при каждом запуске приложения. Будьте осторожны с этой опцией и не используйте ее в производстве, иначе вы можете потерять производственные данные. Эта опция полезна при отладке и разработке. В качестве альтернативы вы можете использовать CLI и запустить команду schema: sync. Обратите внимание, что для базы данных MongoDB она не создает схему, поскольку MongoDB не имеет схемы. Вместо этого он синхронизируется только путем создания индексов.

0 голосов
/ 16 февраля 2019

У меня была эта сущность

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

@Entity()
export class User {

@PrimaryGeneratedColumn()
id!: number;

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

}

и я получаю сообщение об ошибке "столбец" firstName "содержит нулевые значения." Поэтому я добавил {nullable: true}, как @pleerock предложил здесь https://github.com/typeorm/typeorm/issues/845, и это сработало.

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

@Entity()
export class User {

@PrimaryGeneratedColumn()
id!: number;

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

}
0 голосов
/ 31 августа 2018

Что, если вы удалите объявление nullable или что, если вы установите его на true ...

Затем вы можете выполнить проверку nullable, используя проверочные декораторы из class-validator .

...