自定义字符型time类型空值问题,ToDB 返回(nil,nil)类型不能转换(mysql) #1940

Closed
opened 2021-06-09 03:38:16 +00:00 by Bearx · 3 comments

在我的项目中,由于第三方库不支持基类型为time.Time的自定义类型,所以改为基类型为string的类型。
类型定义如下:


type Time string

const (
	NullTime = Time("")
)

// FromDB xorm using
func (t *Time) FromDB(b []byte) error {
	if b == nil || len(b) == 0  {
		*t = NullTime
	} else {
		*t = Time(string(b))
	}
	return nil
}

// ToDB xorm using
func (t *Time) ToDB() ([]byte, error) {
	if t == nil || *t == NullTime {
		return nil, nil //需要在xorm源码Value2Interface方法中加判断 data==nil
	} else {
		return []byte(string(*t)), nil
	}
}

当调用db.insert(&tableStruct)时候,报错:"Error 1292: Incorrect date value: '' for column test.inp_reg.admiss_date at row 1"

跟踪xorm源码 go\pkg\mod\xorm.io\xorm@v1.0.5\internal\statements\values.go

// Value2Interface convert a field value of a struct to interface for puting into database
func (statement *Statement) Value2Interface(col *schemas.Column, fieldValue reflect.Value) (interface{}, error) {
	if fieldValue.CanAddr() {
		if fieldConvert, ok := fieldValue.Addr().Interface().(convert.Conversion); ok {
			data, err := fieldConvert.ToDB()
			if err != nil {
				return nil, err
			}
			if col.SQLType.IsBlob() {
				return data, nil
			}
			// 添加nil判断
			if nil == data {
				return nil, nil
			}
			return string(data), nil
		}
	}

	isNil := fieldValue.Kind() == reflect.Ptr && fieldValue.IsNil()
	if !isNil {
		if fieldConvert, ok := fieldValue.Interface().(convert.Conversion); ok {
			data, err := fieldConvert.ToDB()
			if err != nil {
				return nil, err
			}
			if col.SQLType.IsBlob() {
				return data, nil
			}
			if nil == data {
				return nil, nil
			}
			return string(data), nil
		}
	}
    ...
}

开始部分缺失nil判断


if nil == data {
    return nil, nil
}

添加nil判断后错误得到解决。

在我的项目中,由于第三方库不支持基类型为time.Time的自定义类型,所以改为基类型为string的类型。 类型定义如下: ``` go type Time string const ( NullTime = Time("") ) // FromDB xorm using func (t *Time) FromDB(b []byte) error { if b == nil || len(b) == 0 { *t = NullTime } else { *t = Time(string(b)) } return nil } // ToDB xorm using func (t *Time) ToDB() ([]byte, error) { if t == nil || *t == NullTime { return nil, nil //需要在xorm源码Value2Interface方法中加判断 data==nil } else { return []byte(string(*t)), nil } } ``` 当调用db.insert(&tableStruct)时候,报错:"Error 1292: Incorrect date value: '' for column `test`.`inp_reg`.`admiss_date` at row 1" 跟踪xorm源码 go\pkg\mod\xorm.io\xorm@v1.0.5\internal\statements\values.go ``` go // Value2Interface convert a field value of a struct to interface for puting into database func (statement *Statement) Value2Interface(col *schemas.Column, fieldValue reflect.Value) (interface{}, error) { if fieldValue.CanAddr() { if fieldConvert, ok := fieldValue.Addr().Interface().(convert.Conversion); ok { data, err := fieldConvert.ToDB() if err != nil { return nil, err } if col.SQLType.IsBlob() { return data, nil } // 添加nil判断 if nil == data { return nil, nil } return string(data), nil } } isNil := fieldValue.Kind() == reflect.Ptr && fieldValue.IsNil() if !isNil { if fieldConvert, ok := fieldValue.Interface().(convert.Conversion); ok { data, err := fieldConvert.ToDB() if err != nil { return nil, err } if col.SQLType.IsBlob() { return data, nil } if nil == data { return nil, nil } return string(data), nil } } ... } ``` 开始部分缺失nil判断 ``` go if nil == data { return nil, nil } ``` 添加nil判断后错误得到解决。
Owner

Could you confirm that #1935 resolve you problem?

Could you confirm that #1935 resolve you problem?
Author

Could you confirm that #1935 resolve you problem?

是的,谢谢。

> Could you confirm that #1935 resolve you problem? 是的,谢谢。
Bearx closed this issue 2021-06-09 03:57:02 +00:00
Author

oh my god!

#1935 不应该只在IsBlob()内部判断nil,才能解决我的诉求。

if col.SQLType.IsBlob() {
	if data == nil {
		return nil, nil
	}
	return data, nil
}
  
oh my god! #1935 不应该只在IsBlob()内部判断nil,才能解决我的诉求。 ``` go if col.SQLType.IsBlob() { if data == nil { return nil, nil } return data, nil } ```
Bearx reopened this issue 2021-06-09 04:34:28 +00:00
Bearx closed this issue 2021-06-09 17:03:59 +00:00
Sign in to join this conversation.
No Milestone
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: xorm/xorm#1940
No description provided.