【发布时间】:2018-07-10 03:21:07
【问题描述】:
我在 sqlite3 集合中有一个 json 字段。我的架构如下所示:
CREATE Table Animals(
id int,
sounds json,
name string
)
我了解 go-sqlite 接口does not support the json datatype explicitly。但是,我的 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"
我可以提取我的 json 字段
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 字符串(?)中作为一系列...字节?...我可以使用 String 模块将其转换为字符串。我还对“+”连接操作感兴趣,所以我可以为下游的另一个应用程序做一个查询+字符串+查找+东西。
但是,我真的很想将这一切都捆绑在 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 为空 [] 或真正的 NULL 的情况下使用 []uint8 字符串,并进一步使其对这些具有鲁棒性。
一些参考:
【问题讨论】:
-
您是否已与该数据库架构结婚? SQLite 没有any native support for JSON,所以你做的任何事情都会是一团糟。您可能会更轻松地使用单独的
animal_sounds表,然后将所有内容与 JOIN 和一点 Go 一起收集,以按照您想要的方式构建Animal结构。顺便说一句,您创建为json的那一列实际上只是文本。 -
是的,很遗憾没有上桌。 :/ 有点恶心。
-
我认为像
id int这样的私有字段在结构中不能被 golang json 编码器拾取。 -
如果你真的想存储 JSON 文档,你应该使用 MongoDB、CouchDB 或类似的文档存储。当圆孔也存在时,不要试图将圆钉强行插入方孔。
-
sqlite 多年来一直支持 json 字段。 Mongo 并不是文档存储小镇中唯一的游戏。另外,如果你去 sql 留言板,他们会说同样的问题应该是 /even less/json,因为声音字段应该是连接到另一个表。 ;) 给猫剥皮的方法有很多。
标签: json sqlite go sqlite-json1 go-sqlite3