Arrays 如何将连接映射到具有子结构数组的结构数组
我的数据库中有两个表,Arrays 如何将连接映射到具有子结构数组的结构数组,arrays,go,struct,sqlx,Arrays,Go,Struct,Sqlx,我的数据库中有两个表,tags和record\u tag: tags ---- id name 及 我有两个结构: type Tag struct { Id int `json:"id" db:"id"` Tag_owner string `json:"tag_owner" db:"tag_owner"` Tag_id int `json:"tag_id" db:"tag_id"` Record_id string
tags
和record\u tag
:
tags
----
id
name
及
我有两个结构:
type Tag struct {
Id int `json:"id" db:"id"`
Tag_owner string `json:"tag_owner" db:"tag_owner"`
Tag_id int `json:"tag_id" db:"tag_id"`
Record_id string `json:"record_id" db:"record_id"`
Record_type string `json:"record_type" db:"record_type"`
Record_kind string `json:"record_kind" db:"record_kind"`
Text string `json:"text" db:"name"`
Meta string `json:"meta" db:"meta"`
}
type TaggedRecord struct {
Record_id string `json:"record_id" db:"record_id"`
Tags []Tag `json:"tags" db:"tag_id"`
}
目前,我有一个执行n
调用的循环:
当我将taggedRecords
转换成JSON时,我得到了所需的输出:
[
{
"record_id": "dfwref3f",
"tags": []
},
{
"record_id": "3lkgekrljdkjfkjekjkjker",
"tags": [
{
"id": 6,
"tag_owner": "p0stman",
"tag_id": 2,
"record_id": "3lkgekrljdkjfkjekjkjker",
"record_type": "candidate",
"record_kind": "candidate",
"text": "lol",
"meta": "{\"name\": \"exxon mobile\"}"
},
{
"id": 7,
"tag_owner": "p0stman",
"tag_id": 3,
"record_id": "3lkgekrljdkjfkjekjkjker",
"record_type": "candidate",
"record_kind": "candidate",
"text": "df",
"meta": "{\"name\": \"exxon mobile\"}"
}
]
}
]
显然,这是虚拟数据。上面的实现是可行的,但我不喜欢这样,因为通常n
将是10,这是对数据库的10个单独的网络调用。我已经摸索了一下,尝试了一些东西。。我觉得这应该是一个单一的查询。我已经尝试过实现这个解决方案,但它对我不起作用,因为我的根结构嵌入了一系列子结构,而不仅仅是一个子结构
我试过这个:
taggedRecords := []TaggedRecord{}
var s string
for _, record := range body.Records {
s = s + "r.record_id = '" + record + "' OR "
}
s = s[:len(s)-4]
_ := db.Select(&taggedRecords, "SELECT r.id,r.tag_owner,r.record_id,r.tag_id,r.record_type,r.meta,r.record_kind,t.name,t.id FROM record_tag r, tags t WHERE r.tag_owner = $1 AND "+s+" AND r.tag_id = t.id", body.User)
Select
抛出一个错误,说找不到目标名称id,我认为这是因为它有两个id字段,它不能正确地将连接映射到两个结构上(db
语法似乎不支持点来表示表名或昵称),或者两者的混合
在减少数据库调用的同时,实现此SQL调用并封送到上述输出格式的最佳方法是什么?您可以使用IN表达式选择一组标记 在Go中将其分配给各自的所有者
WHERE some_id IN(1,2,3,4)
您可以通过迭代ID数组来构建它
或者,您可以通过使用SQL别名来避免不明确的查询
SELECT t.id , r.id as r_id
并以多种方式在Go中区分这些列(将列添加到结构中,使用sqlx结构标记…)然后可以使用in表达式选择一组标记 在Go中将其分配给各自的所有者
WHERE some_id IN(1,2,3,4)
您可以通过迭代ID数组来构建它
或者,您可以通过使用SQL别名来避免不明确的查询
SELECT t.id , r.id as r_id
并以多种方式在Go中区分这些列(将列添加到结构,使用sqlx结构标记…)