从 TypeOrm 加载 'bit' Mysql 字段
Loading a 'bit' Mysql field from TypeOrm
我想使用 TypeOrm 将 Mysql 位数据列映射到 boolean
属性。我正在使用 NestJs 框架,但不知道该怎么做。据我所知,框架不支持 Mysql bit
数据类型,但我不知道有什么方法可以解决它。根据 this discussion,在实体中声明一个布尔类型的字段应该就足够了,不要只用 @Column
:
装饰它
@Column()
enable: boolean;
但是,有了这个,我在实体的每个实例中都得到了 true
值。还在实体和 app.module.ts
中尝试了 adding import 'reflect-metadata';
,结果相同。
另一种选择是使用 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,顺便说一句。
我用变压器解决了这个问题:
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;
}
}
然后在 bit/boolean 列中使用此转换器:
@Column({
type: 'bit',
nullable: false,
default: () => `"'b'1''"`,
name: 'can_read',
transformer: new BoolBitTransformer()
})
can_read!: boolean;
我正在通过以下方式解决这个问题
@Column({
name: 'FIELD_NAME',
type: 'bit',
transformer: { from: (v: Buffer) => !!v.readInt8(0), to: (v) => v },
})
readonly field: boolean;
我想使用 TypeOrm 将 Mysql 位数据列映射到 boolean
属性。我正在使用 NestJs 框架,但不知道该怎么做。据我所知,框架不支持 Mysql bit
数据类型,但我不知道有什么方法可以解决它。根据 this discussion,在实体中声明一个布尔类型的字段应该就足够了,不要只用 @Column
:
@Column()
enable: boolean;
但是,有了这个,我在实体的每个实例中都得到了 true
值。还在实体和 app.module.ts
中尝试了 adding import 'reflect-metadata';
,结果相同。
另一种选择是使用 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,顺便说一句。
我用变压器解决了这个问题:
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;
}
}
然后在 bit/boolean 列中使用此转换器:
@Column({
type: 'bit',
nullable: false,
default: () => `"'b'1''"`,
name: 'can_read',
transformer: new BoolBitTransformer()
})
can_read!: boolean;
我正在通过以下方式解决这个问题
@Column({
name: 'FIELD_NAME',
type: 'bit',
transformer: { from: (v: Buffer) => !!v.readInt8(0), to: (v) => v },
})
readonly field: boolean;