1

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.

00robinette
  • 497
  • 5
  • 16
  • A `boolean` in MySQL _IS_ a `tinyint`. Any particular reason the column was specified as a `tinyint` instead of a `boolean`? This could have been avoided by having the database handle it. – RayfenWindspear Nov 21 '18 at 17:41

1 Answers1

4

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.

RayfenWindspear
  • 6,116
  • 1
  • 30
  • 42