• 1. 数据库查询结果转json没有了数值
  • 2. 表字段类型为datetime,参数为time.Time类型,写入后时区不对

    1. 数据库查询结果转json没有了数值

    将数据库数据集进行json编码但是返回结果中没有值,如:

    1. r, _ := db.Table("user").Where("uid=?", 1).One()
    2. if r != nil {
    3. b, _ := gjson.Encode(r)
    4. fmt.Println(string(b))
    5. }

    结果为:

    1. {"email":{},"name":{},"type":{},"uid":{}}

    回答:

    1. 标准库原生的结果集数值为[]byte类型,gdb为了方便开发者转换数据格式,将结果集数值改进为了gvar.VarRead只读对象,因此在以上结果中看到的数值为一个对象的{}
    2. 以上代码中我们可以方便地通过r.ToJson()来进行数据格式转换,当然gdb的结果集支持多种数据格式转换,详细请参考【ORM高级特性】章节;
    3. gvar.VarRead对象的详细介绍请参考【gvar通用动态变量】章节;

    2. 表字段类型为datetime,参数为time.Time类型,写入后时区不对

    以下程序:

    1. r, err := db.Table("user").Data(g.Map{
    2. "name" : "john",
    3. "create_time" : time.Now(),
    4. }).Insert()
    5. if err == nil {
    6. fmt.Println(r.LastInsertId())
    7. } else {
    8. panic(err)
    9. }

    写入成功后,查询写入的数据create_time比系统时间少了8小时,系统为+8时区。

    回答:

    这是因为当传递的参数为time.Time类型时,go-mysql引擎底层会默认使用UTC时间进行保存,你可以将参数给定为字符串来解决这个问题,例如:

    1. r, err := db.Table("user").Data(g.Map{
    2. "name" : "john",
    3. "create_time" : gtime.Now().String(),
    4. }).Insert()
    5. if err == nil {
    6. fmt.Println(r.LastInsertId())
    7. } else {
    8. panic(err)
    9. }

    其中gtime.Now().String()生成的是以当前程序设置时区(没有设置时默认为系统时区)生成的时间字符串,例如:2018-11-11 12:00:00