从TypeOrm加载'bit'Mysql字段

问题描述 投票:0回答:1

我想将一个Mysql位数据列映射到一个带有TypeOrm的boolean属性。我正在使用NestJs框架,无法弄清楚如何做到这一点。据我所见,框架不支持Mysql bit数据类型,但我不知道如何解决它。根据this discussion,它应该足以在实体中声明一个布尔类型的字段,并且除了@Column之外什么也不用它来装饰它:

  @Column()
  enable: boolean;

但是,有了这个,我在实体的每个实例中得到true值。也尝试了adding import 'reflect-metadata';在实体和app.module.ts,具有相同的结果。

另一种选择是使用tinyint类型:

  @Column({
    type: 'tinyint',
  })
  enable: boolean;

有了这个,我得到这种数据,其中data字段保存当前存储的布尔值:

"enable":{"type":"Buffer","data":[1]}

我是否需要进行某种破解才能将其转换为适当的布尔值,或者还有其他更清洁的选择吗?


编辑1

将DB列数据类型更改为int似乎可以生成正确的输出。但是,它不是最合适的解决方案,因为bit类型最适合这里。

正在使用的版本:

  • “@ nestjs / typeorm”:“5.1.0”
  • “typeorm”:“0.2.13”
  • “reflect-metadata”:“0.1.12”
  • Mysql引擎:5.7.25

编辑2

我已经尝试将typeorm相关软件包更新到他们的最新版本,同样一直在发生。还有Mysql 8.0引擎。也试过这些装饰者:

  @Column()
  @IsBoolean()
  enable: boolean;

我在Xubuntu 16.04,BTW。

nestjs typeorm
1个回答
1
投票

我用变压器解决了这个问题:

import {ValueTransformer} from 'typeorm';
class BoolBitTransformer implements ValueTransformer {
  // To db from typeorm
  to(value: boolean | null): Buffer | null {
    if (value === null) {
      return null;
    }
    const res = new Buffer(1);
    res[0] = value ? 1 : 0;
    return res;
  }
  // From db to typeorm
  from(value: Buffer): boolean | null {
    if (value === null) {
      return null;
    }
    return value[0] === 1;
  }
}

然后在位/布尔列中使用此转换器:

  @Column({
    type: 'bit',
    nullable: false,
    default: () => `"'b'1''"`,
    name: 'can_read',
    transformer: new BoolBitTransformer()
  })
  can_read!: boolean;
© www.soinside.com 2019 - 2024. All rights reserved.