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