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

Ave*_*ian 7 postgresql node.js 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
Run Code Online (Sandbox Code Playgroud)

}

我生成迁移并也运行它。当数据库中没有数据并且运行服务器时,它将成功。但是,当我在数据库中添加1行并再次运行它时,出现以下错误:

QueryFailedError: the column «price» contain null values
Run Code Online (Sandbox Code Playgroud)

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

有人对此有想法吗?

nat*_*l93 16

问题

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

@Column({ nullable: false, type: "float" })
public price!: number
Run Code Online (Sandbox Code Playgroud)

您已设置nullable: false,这意味着您永远不希望此列为空。

为什么这会给你带来麻烦?

因为您的数据库中已有行没有该列的条目。

记住:

在此迁移之前,该列不存在。但是现在您正在运行迁移以添加新列。

但是 TypeORM 需要一种方法来处理现有的行...

那么,如果您是 TypeORM,那么如果该列不存在,您会默认分配什么值?大概NULL。这正是它的作用。这就是错误的原因。

你如何解决这个问题?

这里有两种方法。

很简单的方法

设置默认值 ColumnOptions

@Column({ nullable: false, type: "float", default: 0.0 })
public price!: number
Run Code Online (Sandbox Code Playgroud)

危险:核选项

从表中删除所有数据,然后重新运行迁移。

在 Postgres PSQL 中:

DELETE FROM test;
Run Code Online (Sandbox Code Playgroud)


Ala*_*405 11

我遇到了类似的问题,并在此线程的底部进行了报告。

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

这里

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


Dom*_*ver 5

我有这个实体

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

@Entity()
export class User {

@PrimaryGeneratedColumn()
id!: number;

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

}
Run Code Online (Sandbox Code Playgroud)

我收到错误“列“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;

}
Run Code Online (Sandbox Code Playgroud)


Jer*_*ong 5

ormconfig.json中设置"synchronize": false将解决此问题:

{
   ....
   "synchronize": false,
   ....
}
Run Code Online (Sandbox Code Playgroud)


ton*_*ata 0

如果删除nullable声明或者将其设置为true...会怎样?

然后您可以使用class-validatornullable中的验证装饰器进行检查。