【问题标题】:QueryFailedError: the column "price" contain null values - TypeORM - PostgreSQLQueryFailedError:“价格”列包含空值 - TypeORM - PostgreSQL
【发布时间】:2019-02-03 10:57:51
【问题描述】:

我创建了一个简单的表格:

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

数据库中定义了包含所有数据的行。我尝试了很多案例,但没有一个是正确的。

有人知道吗?

【问题讨论】:

  • 你是如何插入数据的?
  • 你弄明白了吗?我有同样的问题。即使有值,我也会收到错误消息。
  • 也有可能你有synchronize: "false"(作为字符串的值),这将被评估为trueBoolean('false') 是真的)。因此,请确保您的 ORM 配置中有 synchronize: false(作为布尔值)。以下投票最多的答案包含详细信息。

标签: node.js postgresql typescript typeorm


【解决方案1】:

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

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

来自here

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

【讨论】:

    【解决方案2】:

    问题

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

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

    【讨论】:

    • 我不明白为什么删除表可以解决问题。
    • 您没有删除该表。而是从表中删除数据。这样做会删除没有列集的行,这些行将在迁移后设置为 NULL。
    • 我对已经存在或已修改的列有同样的问题。
    【解决方案3】:

    我有这个实体

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        然后您可以使用来自class-validator 的验证装饰器进行nullable 检查。

        【讨论】:

          【解决方案6】:

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

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

          或者像@nathanl93 建议的那样,你可以给一个默认值@Column({default: 'aDefaultValue'}),如果没有指定其他值,每次都会在新列中添加指定的默认值。

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

          【讨论】:

          • 这是有用的信息,但不是一个令人满意的答案 b/c 我不希望新列可以为空
          猜你喜欢
          • 2018-08-13
          • 2020-12-08
          • 1970-01-01
          • 2021-10-17
          • 1970-01-01
          • 2021-07-16
          • 2016-09-11
          • 1970-01-01
          • 2022-01-16
          相关资源
          最近更新 更多