Golang Sqlx处理数据库Null值
1.问题描述
1.1环境描述
数据库字段设置如下
CREATE TABLE `area` (
`id` int(11) NOT NULL,
`area_name` varchar(255) DEFAULT NULL,
`city_id` int(11) DEFAULT NULL,
`user_id` int(11) DEFAULT NULL,
`update_at` datetime DEFAULT NULL,
`create_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Golang对应结构体
type Area struct {
Id int `json:"id" db:"id" description:"自增主键"`
AreaName string `json:"area_name" db:"area_name" description:"区域名称"`
CityId int `json:"city_id" db:"city_id" description:"城市id"`
UserId int64 `json:"user_id" db:"user_id" description:"操作人"`
UpdatedAt time.Time `json:"update_at" db:"update_at" description:"更新时间"`
CreatedAt time.Time `json:"create_at" db:"create_at" description:"创建时间"`
}
数据库字段值
查询语句
func (t *Area) TableName() string {
return "area"
}
func (t *Area) Find(tx *sqlx.DB, id string) (*Area, error) {
area := &Area{}
sqlStr := `select * from area where id = ?`
if err := tx.Get(area, sqlStr, id); err != nil {
fmt.Println(err)
return nil, err
}
return area, nil
}
1.2异常信息
使用sqlx查询数据库时,数据库的某些字段被设置成为默认为空即Null。如果数据库的字段值为Null,Sqlx在扫描数据库就会出现如下错误
异常信息:
sql: Scan error on column index 3, name “user_id”: converting NULL to int64 is unsupported
2 解决方案
2.1 使用指针类型
将数据库对应的结构体改为如下格式
注意字段类型的(*)星号
type Area struct {
Id int `json:"id" db:"id" description:"自增主键"`
AreaName string `json:"area_name" db:"area_name" description:"区域名称"`
CityId int `json:"city_id" db:"city_id" description:"城市id"`
UserId *int64 `json:"user_id" db:"user_id" description:"操作人"`
UpdatedAt time.Time `json:"update_at" db:"update_at" description:"更新时间"`
CreatedAt time.Time `json:"create_at" db:"create_at" description:"创建时间"`
}
那个字段会有Null,就将此字段对应的Golang结构体的字段类型改为指针类型即可
再次执行查询语句就会发现没有问题了.
Json查询后的信息如下
{
"id": 1,
"area_name": "wangw",
"city_id": 123,
"user_id": null,
"update_at": "0001-01-01T00:00:00Z",
"create_at": "2020-08-08T17:21:38+08:00"
}
2.2 使用sql.NullInt64
数据库对应的结构体如下
type Area struct {
Id int `json:"id" db:"id" description:"自增主键"`
AreaName string `json:"area_name" db:"area_name" description:"区域名称"`
CityId int `json:"city_id" db:"city_id" description:"城市id"`
UserId sql.NullInt64 `json:"user_id" db:"user_id" description:"操作人"`
UpdatedAt time.Time `json:"update_at" db:"update_at" description:"更新时间"`
CreatedAt time.Time `json:"create_at" db:"create_at" description:"创建时间"`
}
此方法也可以返回正常读出数据,唯有在json序列化和反序列化时,对应的字段会出现:空白或多个值的问题,能查到的基本解决方法都无效