从 TypeOrm 加载“位”Mysql 字段

Xtr*_*ica 2 typeorm nestjs

我想boolean使用 TypeOrm将 Mysql 位数据列映射到属性。我正在使用 NestJs 框架,但不知道该怎么做。据我bit所知,框架不支持Mysql数据类型,但我不知道任何解决方法。根据这个讨论,在实体中声明一个布尔类型的字段应该就足够了,并且不要只用以下内容装饰它@Column

  @Column()
  enable: boolean;
Run Code Online (Sandbox Code Playgroud)

但是,有了这个,我true在实体的每个实例中都获得了价值。也试过添加import 'reflect-metadata';无论是在实体和app.module.ts,具有相同的结果。

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

  @Column({
    type: 'tinyint',
  })
  enable: boolean;
Run Code Online (Sandbox Code Playgroud)

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

"enable":{"type":"Buffer","data":[1]}
Run Code Online (Sandbox Code Playgroud)

我是否需要进行某种黑客攻击才能将其转换为正确的布尔值,还是有其他更清晰的选择来做到这一点?


编辑 1

将 DB 列数据类型更改为int似乎会产生正确的输出。然而,这不是最合适的解决方案,因为bit类型是最适合这里的类型。

正在使用的版本:

  • "@nestjs/typeorm": "5.1.0"
  • "typeorm": "0.2.13"
  • “反射元数据”:“0.1.12”
  • Mysql 引擎:5.7.25

编辑 2

我已经尝试将typeorm相关软件包更新到最新版本,同样的情况一直在发生。还带有 Mysql 8.0 引擎。还尝试使用这些装饰器:

  @Column()
  @IsBoolean()
  enable: boolean;
Run Code Online (Sandbox Code Playgroud)

我在 Xubuntu 16.04,顺便说一句。

mr_*_*all 5

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

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  @Column({
    type: 'bit',
    nullable: false,
    default: () => `"'b'1''"`,
    name: 'can_read',
    transformer: new BoolBitTransformer()
  })
  can_read!: boolean;
Run Code Online (Sandbox Code Playgroud)