从SQL数据库中获取blob(二进制大对象) Golang

5
 import (
       "database/sql"
       "encoding/json"
       "fmt"

       _ "github.com/go-sql-driver/mysql"
   ) 
   type User struct {
       Name string  `json:name`
       Picture []uint8 `json:picture`
    }
    func main(){
       //straight to the query
       rows, err := 'SELECT name, picture FROM ms_users' // picture is longblob type in database
       checkErr(err)

       var usr User
       for rows.Next(){
          err = rows.Scan(&usr.Name, &usr.Picture)
          checkErr(err)
       }
       jsn, err := json.Marshal(usr)
       fmt.Printf("%v, "string(jsn))
    }

使用上述代码,我只能获取名称值,但图片为空。如何将数据库中的blob值存储到结构体中? 任何答案都将不胜感激!谢谢!


使用[]byte代替[]uint8。在此处列出了[]byte,但未列出[]uint8。https://golang.org/pkg/database/sql/#Scan - RayfenWindspear
我改成 []byte 了,但还是空的 :/ - Angger
2
尝试使用 string https://github.com/go-sql-driver/mysql/blob/336127359b09c9c8164e39c4c44f4d36ef081dc8/driver_test.go#L972 - mkopriva
1
有趣的是,当 []byte 无法工作时,string 却可以。在内部,string 就是一个 []byte - RayfenWindspear
1
@RayfenWindspear 看起来他们处理字节切片字符串的方式基本相同,除了空字节切片,... - mkopriva
显示剩余7条评论
1个回答

10

我相对于GO还比较新,当我在寻找解决类似问题的方案时,遇到了这个问题。我已经找到了一个解决方法。

当你从数据库获取BLOB数据时,它会以[]byte类型返回,你的结构体可以像下面这样:

type User struct {
   Name string  `json:name`
   Picture []byte`json:picture`
}

我猜你可以根据需要处理字节数组。在我的情况下,我需要一个JSON对象,所以我将其反序列化为类型接口{}变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接