QueryFailedError:“价格”列包含空值-TYPEORM-POSTGRESQL

时间:2018-08-28 18:21:05

标签: node.js postgresql typescript typeorm

我创建了一个简单的表:

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

数据库明确地具有包含所有数据的行。我尝试了很多情况,但没有一个是正确的。

有人对此有想法吗?

6 个答案:

答案 0 :(得分:4)

我遇到了类似的问题,并且在this thread的底部报告了该问题。

您的ORM配置中可能有synchronize: true。因此,每次运行应用程序时,Typeorm都会尝试创建表,如果有数据,它会引发误导性错误。

来自here

  

synchronize-指示是否应在每次启动应用程序时自动创建数据库模式。请谨慎使用此选项,不要在生产中使用此选项-否则可能会丢失生产数据。此选项在调试和开发期间很有用。作为替代方案,您可以使用CLI并运行schema:sync命令。请注意,对于MongoDB数据库,它不会创建架构,因为MongoDB是无架构的。相反,它仅通过创建索引进行同步。

答案 1 :(得分:0)

如果删除nullable声明怎么办,或者将其设置为true ...

然后,您可以使用class-validator中的验证修饰符进行nullable检查。

答案 2 :(得分:0)

我有这个实体

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

@Entity()
export class User {

@PrimaryGeneratedColumn()
id!: number;

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

}

,并且出现错误“列“ firstName”包含空值”。 因此,我在https://github.com/typeorm/typeorm/issues/845的@pleerock建议中添加了{nullable:true},并且有效。

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

@Entity()
export class User {

@PrimaryGeneratedColumn()
id!: number;

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

}

答案 3 :(得分:0)

问题

这行代码是麻烦的制造者:

@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;

答案 4 :(得分:0)

ormconfig.json

设置“同步”:false 将解决此问题:

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

答案 5 :(得分:0)

我遇到了同样的问题。看起来当您添加一个没有默认值的新列时,该列的默认值将是 null 并且如果您没有明确指定它可以是 null,typeorm 将不允许这样做

对我来说,在添加 @Column({nullable: true}) 后它起作用了。这告诉 typeorm 列中可以包含 null

或者按照@nathanl93 的建议,您可以提供一个默认值 @Column({default: 'aDefaultValue'}),如果没有指定其他值,则每次都会使用指定的默认值添加新列。

您需要确保参数 "syncronize": true 已在其中配置了与数据库的连接。对我来说,它是 ormconfig.json 文件。