Search code examples
gogo-xorm

Convert bool to tinyint golang


I am using the latest version of xorm and want to create a simple go struct as follows:

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

I know the bool type in go evaluates to true and false, but I need to map it to a mySql database where the values are tinyint(3) and 1 maps to true and 0 to false. In the example above no matter what my post requests look like isDeleted always evaluates to 0. Thanks in advance for any advice on this issue. This https://github.com/go-xorm/xorm/issues/673 may provide some context.


Solution

  • I'm not sure what/if xorm can do about it, but you can just create a type and implement the Valuer and Scanner interfaces for it. Here is an example I did a pull request for using a bit(1) for a bool.

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

    For an integer, you would just return the int instead of a []byte containing the int. Like so:

    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
    }
    

    Then your struct would just use the new type

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

    But, again, is there any particular reason you declared this boolean value as a tinyint? MySQL has a boolean type and things would just work.