Конвертировать bool в tinyint golang - PullRequest
0 голосов
/ 21 ноября 2018

Я использую последнюю версию xorm и хочу создать простую структуру go следующим образом:

types myStruct struct {
    isDeleted bool `xorm:"'isDeleted' tinyint(3)"`
}

Я знаю, что тип bool в go оценивается как true и false, но мне нужно отобразить егов базу данных mySql, где значения: tinyint (3) и 1 соответствует true, а 0 - false.В приведенном выше примере, независимо от того, как выглядят мои почтовые запросы, isDeleted всегда оценивается в 0. Заранее спасибо за любые советы по этому вопросу.Это https://github.com/go-xorm/xorm/issues/673 может предоставить некоторый контекст.

1 Ответ

0 голосов
/ 21 ноября 2018

Я не уверен, что / if xorm может с этим поделать, но вы можете просто создать тип и реализовать для него интерфейсы Valuer и Scanner.Вот пример, который я сделал по запросу для использования bit(1) для bool.

https://github.com/jmoiron/sqlx/blob/master/types/types.go#L152

Для целого числа, вы бы просто вернули int вместо[]byte, содержащий int.Например:

type IntBool bool

// Value implements the driver.Valuer interface,
// and turns the IntBool into an integer for MySQL storage.
func (i IntBool) Value() (driver.Value, error) {
    if i {
        return 1, nil
    }
    return 0, nil
}

// Scan implements the sql.Scanner interface,
// and turns the int incoming from MySQL into an IntBool
func (i *IntBool) Scan(src interface{}) error {
    v, ok := src.(int)
    if !ok {
        return errors.New("bad int type assertion")
    }
    *i = v == 1
    return nil
}

Тогда ваша структура будет просто использовать новый тип

type myStruct struct {
    isDeleted IntBool `xorm:"'isDeleted' tinyint(3)"`
}

Но, опять же, есть ли какая-то особая причина, по которой вы объявили это логическое значение как tinyint?MySQL имеет логический тип, и все будет просто работать.

...