【问题标题】:NestJs typeorm - null value in column "***" violates not-null constraint on save methodNestJs typeorm - 列“***”中的空值违反了保存方法的非空约束
【发布时间】:2021-09-06 19:27:26
【问题描述】:

我在尝试一次更新多个记录时遇到问题。 我正在使用实体存储库的方法保存。

这就是它在文档中的使用方式: save - 保存给定的实体或实体数组。如果实体已经存在于数据库中,那么它会被更新。如果实体在数据库中尚不存在,则将其插入。它将所有给定的实体保存在单个事务中(在实体管理器不是事务的情况下)。 还支持部分更新,因为跳过了所有未定义的属性。为了使值 NULL,您必须手动将属性设置为等于 null。

await manager.save(user);
await manager.save([
    category1,
    category2,
    category3
]);

这就是我使用它的方式:

@Injectable()
export class PersonService{
  constructor(
    @InjectRepository(PersonEntity)
    private personService: Repository<PersonEntity>,
  ) {}

  async saveAll(persons: PersonEntity[]) {
    return await this.personService.save(persons);
}
}

persons 输入参数仅包含键 attr 并希望 attr 更新。

我收到此错误: [ExceptionsHandler] 列“*****”中的空值违反非空约束 +17149 毫秒 QueryFailedError:“****”列中的空值违反非空约束

感谢您的帮助!

【问题讨论】:

    标签: node.js nestjs typeorm


    【解决方案1】:

    save() 方法检查带有PrimaryColumn() 装饰器的列是否包含值以确定是更新还是插入记录。

    例如:

    @Entity({ name: 'persons'})
    export class Person {
      @PrimaryColumn()
      id: number
    
      @Column()
      name: string
    
      @Column()
      age: number
    }
    

    现在假设您将以下人员实体传递给 save()

    [
        {
          "id": 1,
          "name": "John",
          "age": 7
        },
        {
          "id": null,
          "name": "Bob",
          "age": 8
        }
    ]
    

    John 将被更新,而 Bob 将被插入。

    在您的情况下,我怀疑您没有向主列提供值,因此 TypeORM 试图将记录插入 db 并且该记录包含非空列的空值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 2018-03-18
      • 2016-02-14
      • 2017-02-18
      • 2020-08-12
      相关资源
      最近更新 更多