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