Golang Sqlx 查询数据库Null 报错 sql: Scan error on column index 3, name “user_id“: converting NULL to int64

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序列化和反序列化时,对应的字段会出现:空白或多个值的问题,能查到的基本解决方法都无效

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值