Загрузка битового поля Mysql из TypeOrm - PullRequest
0 голосов
/ 18 марта 2019

Я хочу сопоставить столбец битовых данных Mysql со свойством boolean с TypeOrm. Я использую инфраструктуру NestJs и не могу понять, как это сделать. Насколько я видел, тип данных Mysql bit не поддерживается платформой, но я не знаю, как это обойти. Согласно этой дискуссии должно быть достаточно объявить логическое типизированное поле в сущности и не украшать его ничем, кроме @Column:

  @Column()
  enable: boolean;

Однако, с этим я получаю значение true в каждом отдельном экземпляре объекта. Также попытался добавить import 'reflect-metadata'; либо в сущности, либо в app.module.ts, с тем же результатом.

Другой вариант - использовать тип tinyint:

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

С этим я получаю данные такого типа, где в поле data хранится текущее логическое значение:

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

Нужно ли делать какой-то хак, чтобы преобразовать это в правильное логическое значение, или есть другой более чистый выбор, чтобы сделать это?


РЕДАКТИРОВАТЬ 1

Изменение типа данных столбца БД на 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;

Я в Xubuntu 16.04, кстати.

1 Ответ

1 голос
/ 22 марта 2019

Я решил эту проблему с помощью преобразователя:

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