sqlite3中的JSON字段

sqlite3中的JSON字段,json,sqlite,go,sqlite-json1,go-sqlite3,Json,Sqlite,Go,Sqlite Json1,Go Sqlite3,我在sqlite3集合中有一个json字段。我的模式如下所示: CREATE Table Animals( id int, sounds json, name string ) 我理解go-sqlite接口。然而,我的json非常简单,因为所有字段都是json数组,例如 ["bark", "woof", "growl"] ["meow", "hiss", "growl"] 因此,完整记录可能是: id sounds name 1

我在sqlite3集合中有一个json字段。我的模式如下所示:

CREATE Table Animals(
  id int,
  sounds json,
  name string
)
我理解go-sqlite接口。然而,我的json非常简单,因为所有字段都是json数组,例如

["bark", "woof", "growl"]
["meow", "hiss", "growl"]
因此,完整记录可能是:

id   sounds                      name
1    ["bark", "woof", "growl"]   Fido
2    ["meow", "hiss", "growl"]   Rufus
使用软件包:

_ "github.com/mattn/go-sqlite3"
我可以用

var id sql.NullInt64
var name sql.NullString
var sounds []uint8

err := db.QueryRow("SELECT id,name,sounds FROM Animals WHERE id = ?;", 1).Scan(&id, &name, &sounds)

fmt.Println(strconv.Itoa(id) + "|" + name + "|" + strings.Join(sounds, "+"))

// does print correctly:
1|Fido|bark+wood+growl
也就是说,sqlite3 json似乎以unicode字符串(?)的形式存储为一系列…字节?…我可以使用字符串模块将其转换为字符串。我还对“+”连接操作感兴趣,这样我就可以为下游的另一个应用程序从中查询+字符串+查找+内容

然而,我真的很想将这些都打包到JSON中,并利用JSON解组/解析,而不是我的特别定制打印。当我尝试时:

type Animal struct {
    id int                   `json:"id"`
    name sql.NullString      `json:"name"`
    sounds []uint8           `json:"sounds"`
}

var a Animal

err := db.QueryRow("SELECT id,name,sounds FROM Animals WHERE id = ?;", 1).Scan(&a.id, &a.name, &a.sounds
)
它打印一个真正的整数数组。如何在启用json的类型定义中嵌入strings.Join(sounds[]uint8)声明+函数转换组合

此外,我还不清楚如何在json为空[]或真空的情况下使用[]uint8字符串,并进一步增强其抗这些错误的能力

参考文献:


    • 你的问题引出了几个话题。但最简单的答案可能是:

      不要使用关系数据库。

      您似乎想要获取对象/文档,因此使用本机支持的存储机制可以防止到处都需要乱码。MongoDB、CouchDB或其他一些NoSQL解决方案可能正适合您的需求

      尽管如此,你的具体问题还是有答案的。不过,把它们放在一起,可以说是构成了复杂而丑陋的东西

    • 您的
      声音
      类型
    • 创建实现接口的自定义类型,并为您解组JSON值:

          type Sounds []string
      
          func (s *Sounds) Scan(src interface{}) error {
              switch t := src.(type) {
              case []byte:
                  return json.Unmarshal(t, &s)
              default:
                  return errors.New("Invalid type")
              }
          }
      
    • 扫描结构
    • 用于此。它允许您将整行扫描到结构中,比标准库容易得多。它可以使用
      db
      标记将行与struct字段匹配

    • DB和JSON的单一结构
    • 结构中可以有多个标记:

          type Animal struct {
              id int                   `db:"id" json:"id"`
              name sql.NullString      `db:"name" json:"name"`
              sounds []uint8           `db:"sounds" json:"sounds"`
          }
      

      你嫁给了那个数据库模式吗?SQLite没有,所以您所做的任何事情都将是一团糟。使用一个单独的
      animal\u sounds
      表,然后将所有内容与连接一起收集,然后稍微按照您想要的方式构建
      animal
      结构,可能会更容易。顺便说一句,您创建为
      json
      的列实际上只是文本。是的,不幸的是,没有生成表。:/有点恶心。我认为像结构中的
      id int
      这样的私有字段不能被golang json编码器获取。如果你真的想存储json文档,你应该使用文档存储,比如MongoDB、CouchDB或类似的。当存在圆孔时,不要试图将圆孔钉入方孔。sqlite多年来一直支持json字段。Mongo不是文档存储镇上唯一的游戏。另外,如果你去sql留言板,他们会说同样的问题应该是/less/json,因为sounds字段应该是另一个表的连接给猫剥皮有很多方法。